将List <string>传递给期望List <object> </object> </string>的方法

时间:2013-06-17 08:25:05

标签: java generics

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);


}

它运行没有任何错误......这是书内容中的错误吗?我引用了第二版

5 个答案:

答案 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;”