我的Java子类有问题。我有以下课程:
MainIterator implements Iterator{
//... Methods from the interface Iterator
public void foo(){
//Do something...
}
}
在我的主要课程中我打电话:
Iterator i = new MainIterator();
i.foo();
哪个不起作用,因为Iterator没有实现函数 foo()。如果没有i
的类型转换,怎么可能让它工作? i
必须来自Iterator类型。
答案 0 :(得分:1)
MainIterator i = new MainIterator();
Java编译器只允许调用属于声明的类型变量的方法。如果你使用
Iterator i = new MainIterator();
你告诉编译器:我创建了一个类型为MainIterator的Iterator实例,但你不需要在其余的代码中知道它。只需将此对象视为迭代器的实例。并且Iterator没有任何foo()方法。
答案 1 :(得分:1)
您可以将变量声明为MainIterator
:
MainIterator i = new MainIterator();
i.foo();
或者你可以施放:
Iterator i = new MainIterator();
((MainIterator) i).foo();
没有其他方法可以做到。
答案 2 :(得分:0)
Iterator没有定义foo(),所以你不能直接在Iterator类型的变量上调用foo()。
MainIterator定义了foo(),因此您可以在MainIterator类型的变量或子类型上调用foo()。
您可以将类型Iterator的变量强制转换为MainIterator。除此之外别无他法。这就是它应该如何运作。
答案 3 :(得分:0)
如果您在使用i
时确定,则i
类型为MainIterator
,施展它是没关系的。此外,如果您确定此时需要具体的 MainIterator 实例,则只需将其键入MainIterator i = new MainIterator()
即可。对于这两种情况,这意味着您的设计与特定实现紧密耦合,这违背了使用接口的目的。所以在这一点上我会看一下设计,以确保在您确定的地方发生,您需要的只是MainIterator
的实例而没有其他实例。
如果您必须使用Iterator
但i
可以是Iterator
的任何实现,那么您会遇到设计问题,因为您与特定实现紧密耦合(因为您希望使用void foo
方法),但您的代码也想要使用所有实现。这是一个你必须解决的矛盾,很难说如何在不看你的整体设计的情况下纠正它。