无法从ArrayList <string>转换为List <comparative> </comparative> </string>

时间:2011-12-19 14:04:13

标签: java generics inheritance

当我编写以下代码时,编译器说

  

无法从ArrayList<String>转换为List<Comparable>

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

但是当我用通配符编写返回类型时,代码会编译。

private List<? extends Comparable> get() {
    return new ArrayList<String>();
}

有人能解释我为什么吗?

5 个答案:

答案 0 :(得分:6)

List<String>不是List<Comparable> 毕竟,您可以将Integer放入List<Comparable>

答案 1 :(得分:2)

因为List<Comparable>可以添加Comparable的任何实例,例如Integer。但是,ArrayList<String>仅允许包含String个实例。允许将其用作List<Comparable>会破坏类型安全性。

答案 2 :(得分:1)

String不是Comparable,它扩展了Comparable。

e.g。

List<String> list1 = new ArrayList<String>();
List<Comparable> list2 = list1; // does not compile.
list2.add(1); // if this program compiled you would have a 1 in the list of String.

答案 3 :(得分:1)

这是仿制药的工作原理。我认为最好的解释是:http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

答案 4 :(得分:-2)

原因是第二部分是你真正想要的:一个扩展Comparable的类(String)。由于Comparable是一个接口,你不能拥有Comparable对象,只是一个实现它的类。这就是List&lt;? extends Comparable&gt;告诉Java寻找。

希望它有所帮助。

亚历