使用Java中的其他方法的子类

时间:2013-11-21 23:05:41

标签: java class subclass superclass

我的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类型。

4 个答案:

答案 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的实例而没有其他实例。

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