我不明白。在java中,我允许将接口声明为方法的返回类型,如:
public List<String> get(){
return new ArrayList<String>();
}
如果我现在有一个接口可以说I
和一个类C
来实现它,为什么我不允许这样定义:
public List<I> get(){
return new ArrayList<C>();
}
我知道创建ArrayList<I>
并添加C
的解决方案,但我想知道为什么我不允许像上面那样声明它。我认为每个C
也是I
虽然它应该没问题。
答案 0 :(得分:10)
您无法执行此操作,因为List<I>
和List<C>
是不兼容的类型。
你可以这样做,但是
public List<? extends I> get(){
return new ArrayList<C>();
}
答案 1 :(得分:5)
你遇到了共同和逆转的问题。简而言之:您的List<I>
界面还有一个方法Add
,它需要一个I
的实例,但不是每个I
实际上都会由{{1}实现任何其他类也可以实现C
。因此,您最终会遇到类型转换问题。