我如何能够将ArrayList <String>插入到接受List <Integer>的构造函数中?

mat*_*ndr 6 java generics constructor types

我有这门课:

public class TestSubject {
    public TestSubject(List<Integer> list) {
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在以这样的方式实例化它并以某种方式它正在工作,即使我正在插入一个ArrayList<String>接受的构造函数List<Integer>:

List<String> strings = new ArrayList<>();
strings.add("foo");
Constructor<TestSubject> constructor = TestSubject.class.getConstructor(List.class);
TestSubject test = constructor.newInstance(strings);
Run Code Online (Sandbox Code Playgroud)

这是我在实例化后看到的:

在此输入图像描述

这怎么可能?

另外,如何从实例化代码中确保正在使用正确类型的列表?

Cod*_*roc 3

这是由于类型擦除而发生的。它将<Integer>被抹去,并且将成为List唯一。但是,您正在使用反射创建实例,并且在运行时它不会检查List.

如果您使用以下命令创建列表,则会在编译时检查列表的类型,new但在这种情况下您跳过了编译时检查,并且在运行时由于类型擦除而有效。

在您的情况下,除了在构造函数中手动检查元素的类型之外,没有其他直接的方法。

  • @mattalxndr,您_无法_确保使用正确的类型。运行时不存在“List&lt;Integer&gt;”或“List&lt;String&gt;”之类的东西:只有“List”。这就是“类型擦除”的含义。您能做的最好的事情就是检查列表中的各个成员,以确定它们是“Integer”还是“String”,但请注意,原则上单个列表可以包含这两种类型的对象。 (5认同)