如何使用Collections.checkedlist

How to use Collections.checkedlist

List<SomeClass<String>> list = new ArrayList<SomeClass<String>>();
List l = Collections.checkedList(list, SomeClass.class);

那是我的 code.Eclipse 告诉我有一些错误:

The method checkedList(List<E>, Class<E>) in the type Collections is not applicable for the arguments (List<SomeClass<String>>, Class<SomeClass>)

如何使用checkedList?如何更改代码?

Java 无法在运行时检查类型的泛型参数 (How to get a class instance of generics type T),因此 checkedList 将无法强制执行类型的 <String> 部分签名.

您可以添加转换以允许此方法调用,因此 checkedList 将强制仅将 SomeClass<?> 的实例添加到 List,但您不会拥有完整的类型运行时安全。

您可以将 Class<SomeClass> 转换为原始 Class 以使其编译。

List<SomeClass<String>> list = new ArrayList<>();
List l = Collections.checkedList(list, (Class)SomeClass.class);

请注意,由于 type erasure

,您无法在运行时检查类型参数

问题是您不能在 Java 中拥有 class 通用类型的文字:Java: how do I get a class literal from a generic type? 并且 List 包含 <Foo<Bar>> 您的 class 文字必须是 Foo<Bar>.class.

无论如何,由于 checkedList 将在运行时添加类型安全检查,您可以尝试使用 dirty 解决方案之一,例如原始类型:

List<SomeClass<String>> list = new ArrayList<>();
List l = Collections.checkedList((List)list, SomeClass.class);