【问题标题】:How to use Collections.checkedlist [duplicate]如何使用 Collections.checkedlist [重复]
【发布时间】:2015-07-12 04:04:49
【问题描述】:
List<SomeClass<String>> list = new ArrayList<SomeClass<String>>();
List l = Collections.checkedList(list, SomeClass.class);

那是我的代码。Eclipse 告诉我有一些错误:

Collections 类型中的方法checkedList(List&lt;E&gt;, Class&lt;E&gt;) 不适用于参数(List&lt;SomeClass&lt;String&gt;&gt;, Class&lt;SomeClass&gt;)

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

【问题讨论】:

    标签: java collections


    【解决方案1】:

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

    您可以添加强制转换以允许此方法调用,因此checkedList 将强制仅将SomeClass&lt;?&gt; 的实例添加到List,但您不会在运行时获得完全的类型安全。

    【讨论】:

      【解决方案2】:

      您可以将Class&lt;SomeClass&gt; 转换为原始Class 以使其编译。

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

      请注意,由于type erasure,您无法在运行时检查类型参数。

      【讨论】:

        【解决方案3】:

        问题是您不能在 Java 中使用泛型类型的类文字:Java: how do I get a class literal from a generic type?,而对于包含 &lt;Foo&lt;Bar&gt;&gt;List,您的类文字必须是 Foo&lt;Bar&gt;.class

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

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

        【讨论】:

          猜你喜欢
          • 2010-11-12
          • 2017-10-09
          • 2016-03-11
          • 2016-07-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多