Java泛型 - 覆盖返回set <T>的函数

Yos*_*ale 4 java generics

这有效:

public interface A {
     A doSomething(); 
}

public interface B extends A{
     B doSomething(); 
}
Run Code Online (Sandbox Code Playgroud)

这不是:

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

public interface B extends A{
     Collection<B> doSomething(); 
}
Run Code Online (Sandbox Code Playgroud)

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

Joa*_*uer 6

其原因是,Collection<B>不是分型 Collection<A>.

并非所有可能使用a的操作Collection<A>都可以使用a Collection<B>.例证:调用add(new A())使用a Collection<A>必须失败Collection<B>(即使只是在编译时检查过).

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

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

public interface B extends A{
     Collection<? extends B> doSomething();
}
Run Code Online (Sandbox Code Playgroud)

如果你愿意,你甚至可以让它B.doSomething()返回a Collection<B>,但是你将无法再以B相同的方式延伸.