Java 泛型:为什么传递List而不是List会导致编译时错误

Java 泛型:为什么传递List而不是List会导致编译时错误,java,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");

我对下面代码中的泛型实现有一个疑问

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
    }
}
它的作品

请帮我离开这里。 谢谢。

因为列表不是列表的一种类型。当你开始学习泛型时,这是一个典型的陷阱。首先,您可能会直觉地认为字符串列表实际上是对象列表,因为字符串是对象,对吗?但是,从一个列表到另一个列表的自动强制转换将允许List参数的接收者传入并将任意对象添加到字符串列表中,这正是您试图用泛型来阻止的:

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!
列表不是列表的一种类型

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

public void print(List<?> obj) {
    for(Object o: obj)
         obj.toString();
}
在这种情况下,列表将在编译时包含某些给定未知类型的对象。由于toString是在对象中定义的方法,所以不会得到任何编译时错误。考虑调查


但是,如果您的打印代码与您发布的代码类似,您应该得到一个警告。如果签名是printList obj,那么由于我提到的原因,您有一个编译错误。

在发布代码块时,您必须将它们缩进四个空格,前后各有一个空行,以便使它们显示为逐字预格式化的文本,而不是解释为html。这与泛型问题特别相关,因为你失去了所有的东西。你确定你使用的是列表而不是列表吗?顺便说一句,如果你想让你的方法接受所有的列表,你应该让它接受列表来编译而不带警告。代码和文本似乎不匹配,但很可能是一个副本,它反过来又是一个列表的副本,而不是列表,所以应该有使用非泛型类型的警告,而不是错误。例如,这将编译:这实际上应该是一个错误,因为您可以提供一个检查,以确保传递的类型不正确。把它作为一个警告将导致许多潜在的错误。因为程序员都是懒散的definition@KurtDuBois我不是说它应该是怎样的,但是你应该在这里讨论向后兼容性,而是它是怎样的。
public void print(List<?> obj) {
    for(Object o: obj)
         obj.toString();
}