当我编写以下代码时,编译器说
无法从
ArrayList<String>
转换为List<Comparable>
private List<Comparable> get(){
return new ArrayList<String>();
}
但是当我用通配符编写返回类型时,代码会编译。
private List<? extends Comparable> get() {
return new ArrayList<String>();
}
有人能解释我为什么吗?
答案 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寻找。
希望它有所帮助。
亚历