使用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。 没有别的办法解决这个问题。 这就是它应该如何工作。

如果您确定在使用ii 肯定MainIterator类型,那么可以投射它。 此外,如果您确定此时需要具体的MainIterator实例,则只需将其键入为MainIterator i = new MainIterator() 。 对于这两种情况,这意味着您的设计与特定实现紧密耦合,这违背了使用接口的目的。 所以在这一点上,我会看看设计,以确保在您确定所需的全部是MainIterator的实例而没有其他实例的情况下发生。

如果你必须使用Iteratori可以是Iterator任何实现,你有一个设计问题,因为你紧密耦合到一个特定的实现(因为你使用void foo方法),但你的代码希望使用所有的实现。 这是一个你必须解决的矛盾,很难说如何在不看你的整体设计的情况下纠正它。