假设我们有内部类(其余的代码并不是很重要,我想DataStructureIterator只是java.util.Iterator<Integer>扩展的接口):

private class EvenIterator implements DataStructureIterator

现在我们要创建一个返回EvenIterator的新实例的方法。正如我注意到的,我们可以通过多种方式做到这一点:


public EvenIterator getEvenIterator(){return new EvenIterator();}
public DataStructureIterator getEvenIterator() {return new EvenIterator();}


我发现两个版本的代码都可以很好地编译,但是我无法理解它们之间的区别以及应该使用哪个版本。

最佳答案

这取决于。如果您的方法契约表明您要返回某种迭代器(即,不是特定的实现),请返回该接口。换句话说,您的合同说“除迭代整数的能力外,不要承担任何其他行为/功能”。这样做的好处是,您之后可以将基础实现换成其他东西。呼叫者不在乎,也不在乎。

另一方面,如果方法的约定是返回一个专门提供仅对偶数进行迭代的能力的迭代器,则返回EvenIterator。这必然意味着您不能换出实现(不能对偶数进行迭代),并且这样做意味着破坏/更改合同。您可以进一步抽象,使EvenIterator本身成为接口,并为迭代器提供不同的实现(也许一个迭代一个内部链接列表,另一个迭代一个内部数组,或者也许您可以迭代特定类型的偶数整数) ;例如2的幂与4的幂。

关于java - Java接口(interface)与类作为返回类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36582015/

10-09 01:24