使用Java中的其他方法的子类
我在Java中有一个子类的问题。 我有以下课程:
MainIterator implements Iterator{ //... Methods from the interface Iterator public void foo(){ //Do something... } }
在我的主要class级我打电话:
Iterator i = new MainIterator(); i.foo();
哪个不起作用,因为Iterator没有实现函数foo() 。 如果没有i
的类型,怎么可能让这个工作? i
必须来自Iterator类型。
MainIterator i = new MainIterator();
Java编译器仅允许调用属于声明的变量类型的方法。 如果你使用
Iterator i = new MainIterator();
你告诉编译器: 我创建了一个类型为MainIterator的Iterator实例,但你不需要在其余的代码中知道它。 只需将此对象视为Iterator的一个实例。 而Iterator没有任何foo()方法。
您可以将变量声明为MainIterator
:
MainIterator i = new MainIterator(); i.foo();
或者你可以施放:
Iterator i = new MainIterator(); ((MainIterator) i).foo();
没有其他方法可以做到这一点。
Iterator没有定义foo(),所以你不能直接在Iterator类型的变量上调用foo()。
MainIterator定义了foo(),因此您可以在MainIterator类型的变量或子类型上调用foo()。
您可以将类型Iterator的变量强制转换为MainIterator。 没有别的办法解决这个问题。 这就是它应该如何工作。
如果您确定在使用i
, i
肯定是MainIterator
类型,那么可以投射它。 此外,如果您确定此时需要具体的MainIterator实例,则只需将其键入为MainIterator i = new MainIterator()
。 对于这两种情况,这意味着您的设计与特定实现紧密耦合,这违背了使用接口的目的。 所以在这一点上,我会看看设计,以确保在您确定所需的全部是MainIterator
的实例而没有其他实例的情况下发生。
如果你必须使用Iterator
但i
可以是Iterator
任何实现,你有一个设计问题,因为你紧密耦合到一个特定的实现(因为你想使用void foo
方法),但你的代码也希望使用所有的实现。 这是一个你必须解决的矛盾,很难说如何在不看你的整体设计的情况下纠正它。
- 重构静态方法/静态字段以进行测试
- 从长UTC时间戳到JAVA UTC到EST
- 使用BorderLayout将JPanel浮动到JPanel上方
- Spring Boot应用程序在部署到Tomcat时提供404,但与嵌入式服务器配合使用
- 在`WEB-INF / lib`文件夹中找不到jar文件的解决方案,也没有在`src / main / resources`文件夹中找到?
- 在Spring MVC 3中指定HTTP“位置”响应头的首选方法是什么?
- SpringBoot,如何在不使用ldif的情况下使用LDAP进行身份validation?
- 如何将图像从一个面板拖动到另一个面板
- JBoss在展开的部署目录上重新部署更改