这有效:
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)
为什么?如何在第二个示例中获得我想要的功能?
其原因是,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相同的方式延伸.
| 归档时间: |
|
| 查看次数: |
107 次 |
| 最近记录: |