2011-08-17 47 views
4

此工作的功能:Java泛型 - 重写返回一组<T>

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

将其更改为:

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

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

,它会正常工作。

这是因为“B的集合不扩展A的集合”,尽管B扩展了A.需要将返回类型定义为“扩展A的项目集合”,而不是将其进一步缩小作为

6

“B的集合”。令人困惑的,是的......但是这只是它是如何。其原因是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