Java泛型 - 覆盖返回集合<t> </t>的函数

时间:2011-08-17 14:25:34

标签: java generics

这有效:

public interface A {
     A doSomething(); 
}

public interface B extends A{
     B doSomething(); 
}

这不是:

public interface A {
     Collection<A> doSomething(); 
}

public interface B extends A{
     Collection<B> doSomething(); 
}

为什么呢?如何在第二个示例中获得我想要的功能?

3 个答案:

答案 0 :(得分:6)

原因是Collection<B> 不是 Collection<A>的子类型。

Collection<A>也不能使用Collection<B>进行所有操作。举个例子:调用add(new A())可以使用Collection<A>必须使用Collection<B>失败(即使只是在编译时检查过)。

如果你不关心元素添加到返回的Collection(通常你只关心迭代它们,有效地将它们视为只读),那么你可以这样做:

public interface A {
     Collection<? extends A> doSomething();
}

public interface B extends A{
     Collection<? extends B> doSomething();
}

如果您愿意,您甚至可以让B.doSomething()返回Collection<B>,但之后您将无法以同样的方式延长B

答案 1 :(得分:3)

将其更改为:

public interface A {
    Collection<? extends A> doSomething();
}

public interface B extends A{
    Collection<B> doSomething(); 
}

它会正常工作。

这是因为“B的集合”不扩展A“的集合,即使B扩展A. A需要将返回类型定义为”扩展A的项集合“,而不是将其缩小为“B的集合。”令人困惑,是的......但这就是它的原因。

答案 2 :(得分:0)

试试这个

public interface A {
     Collection<? extends A> doSomething(); }

http://www.oracle.com/technetwork/articles/javase/generics-136597.html