2012-01-08 74 views
2

我不明白这一点。在java中我被允许申报一个接口作为方法的返回类型,如:为什么一个方法的这个通用返回类型是无效

public List<String> get(){ 
    return new ArrayList<String>(); 
} 

如果我现在有一个接口可以说I和类C实现它,为什么我不能这样定义:

public List<I> get(){ 
    return new ArrayList<C>(); 
} 

我知道的解决方案来创建一个ArrayList<I>并添加C它,但我不知道为什么我不能宣布它像上面的一个。我想,每一个C也是I虽然它应该是没有问题的。

回答

10

你不能这样做,因为List<I>List<C>是不兼容的类型。

你可以这样做,但是

public List<? extends I> get(){ 
    return new ArrayList<C>(); 
} 
+0

打我吧! 1+ – 2012-01-08 16:06:33

4

您正在运行与合作和逆变的问题。简而言之:你的List<I>接口也有一个方法Add,该方法预计I的一个实例,但不是每个I实际上都将由C实现,因为任何其他类也可以实现I。因此,你会类型转换问题告终。

相关问题