泛型:为什么传递List <string>而不是List <object>会产生编译时错误</object> </string>

时间:2014-09-25 09:07:41

标签: java

我对以下代码中的泛型实现存在疑问,

class A {

    public void print(List obj) {
    }

    public static void main(String args[]) {
        ClassA aObj = new ClassA();
        List<String> strList = new ArrayList<String>();
        strList.add("ABC");
        aObj.print(strList); // Complile time error
    }
}

为什么我得到complie时间错误。我知道,为了避免类型转换或运行时ClassCastException,jdk 1.5引入了泛型但是在上面的代码片段中,我只是想到了父子概念并试图传递List of String而不是Object。那么为什么我得到编译时错误。

我的问题的理由 如果我在上面编写相同的代码,请假设

class A {

    public void print(Object obj) {
    }

    public static void main(String args[]) {
        ClassA aObj = new ClassA();
        aObj.print("ABC"); // Vallid
    }
}

它的作品!!

请帮我离开这里。 感谢。

2 个答案:

答案 0 :(得分:0)

仅仅因为List<String>不是List<Object>的类型。当你开始学习它时,这是典型的泛型陷阱。首先,您可能直观地认为字符串列表实际上是一个对象列表,因为字符串是对象,对吧?但是,从List<String>List<object>的自动转换将允许List<Object> - 参数的接收者将任意对象传递(添加)到您的字符串列表中,这正是您正在尝试的使用泛型来防止:

List<String> strings = new List<String>();
strings.Add("a");
strings.Add("b");

// Not allowed, but for illustration.
List<Object> objects = strings;
objects.Add(new Object()); // Oops!

答案 1 :(得分:0)

List<String>不是List<Object>的类型。

如果在每个List项上定义print以调用toString,则可以执行以下操作:

public void print(List<?> obj) {
    for(Object o: obj)
         obj.toString();
}

在这种情况下,List将包含&#34; some&#34;给定未知类型的对象(在编译时)。由于toString()是Object中定义的方法,因此不会出现任何编译时错误。考虑调查Java Generic Wildcards

但是,如果您的打印代码与您发布的代码类似,则应该收到警告。如果签名是print(List<Object> obj),那么由于我提到的原因你就有编译错误。