这有效:
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();
}
为什么呢?如何在第二个示例中获得我想要的功能?
答案 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