在Page 112 of CHAPTER 5 GENERICS in the book - Effective Java
中,出现这些句子
原始类型
List
和。{1}之间的区别是什么? 参数化类型List<Object>
...虽然您可以传递List<String>
对于List类型的参数,您不能将其传递给类型的参数List<Object>
我试过这个
public static void getMeListOfObjs(List<Object> al){
System.out.println(al.get(0));
}
public static void main(String[] args) {
List<Object> al = new ArrayList<Object>();
String mys1 = "jon";
al.add(mys1);
getMeListOfObjs(al);
}
它运行没有任何错误......这是书内容中的错误吗?我引用了第二版
答案 0 :(得分:6)
试试这个:
public static void getMeListOfObjs(List<? extends Object> al) {
System.out.println(al.get(0));
}
public static void main(String[] args) {
List<String> al = new ArrayList<String>();
String mys1 = "jon";
al.add(mys1);
getMeListOfObjs(al);
}
这不会编译,因为List<String>
不匹配List<Object>
@darijan指出通配符?扩展类型chack与所有后代类。
我建议您详细了解generics and wildcards
答案 1 :(得分:1)
您提供的代码有效。我想您希望al
列表为List<String>
。然后,你必须像这样getMeListOfObjs
:
public static void getMeListOfObjs(List<? extends Object> al) {
System.out.println(al.get(0));
}
public static void main(String[] args) {
List<String> al = new ArrayList<String>();
String mys1 = "jon";
al.add(mys1);
getMeListOfObjs(al);
}
注意差异?
public static void getMeListOfObjs(List<? extends Object> al) {
通配符?
更改任何扩展Object
的类型,即任何对象。
答案 2 :(得分:0)
您创建的示例不会创建List<String>
。您还可以使用List<Object>
将字符串添加到对象列表中。所以你基本上传递了Object list,这就是它的工作原理。您可以添加对象列表中的任何对象,包括字符串。它起作用,因为String扩展了Object。
答案 3 :(得分:0)
您只传递List<Object>
。如果您担心String
List<Object>
完全正常,因为String
IS-A Object
。
因为即使您在String
中添加List<Object>
作为元素,也会将List<Object>
传递给该方法。
答案 4 :(得分:0)
这本书说你可以这样做:
List al = new ArrayList<String>();
(但是Eclipse建议你不要使用原始类型......“List是一个原始类型。对泛型类型List的引用应该参数化”)
但你不能这样做:
List<Object> al = new ArrayList<String>();
因为编译器识别出类型不匹配“无法从ArrayList&lt; String&gt;转换为List&lt; Object&gt;”