【问题标题】:Why is the difference in declaration of generic Lists?为什么泛型列表的声明有所不同?
【发布时间】:2012-04-14 02:36:30
【问题描述】:

我想删除两个列表: 首先是整数列表。我把它当做:

  List<Integer> ints= Arrays.asList(1,2,3);

效果很好。

其次是对象列表。我声明为:

  List<Object> objs= Arrays.asList(1,2.13,"three");

但是我一写它就会在 Eclipse 中出现错误。错误是:

  Multiple markers at this line
- Type mismatch: cannot convert from List<Object&Comparable<?>&Serializable> to 
 List<Object>
- Type safety: A generic array of Object&Comparable<?>&Serializable is created for
       a varargs parameter

如果我写的话

  List<Object> objs = Arrays.<Object>asList(1,2.13,"three");

效果很好。

我不知道原因。

【问题讨论】:

    标签: java generics collections jvm compiler-errors


    【解决方案1】:

    this post on stackoverflow

    15.12.2.7 根据实际参数推断类型参数

    超类型约束 T :> X 意味着解决方案是 X 的超类型。给定 T 上的几个这样的约束,我们可以相交 每个约束隐含的超类型集,因为 类型参数必须是所有这些的成员。然后我们可以选择 交叉口中最具体的类型

    StringDoubleInteger 之间最严格的类型交集是接口 ComparableSerializable。所以当你写

    Arrays.asList(1,2.13,"three"); 
    

    它推断Timplements Comparable&lt;?&gt;, Serializable。那么就好像你在做

    List<Object> objs = new List<T extends Comparable<?>, Serializable>
    

    显然,这是不允许的。
    另一方面,当您使用显式指定Object

    Arrays.<Object>asList(1,2.13,"three");
    

    没有推断

    【讨论】:

    • 知道了。感谢非常好的解释。如果出现此类混淆,这将是一条适用的黄金法则。
    【解决方案2】:

    完美使用它

    List<? extends Object> objs = Arrays.asList(10,20.32,"test");
    
    System.out.println(objs);
    

    输出: [10, 20.32, test]

    【讨论】:

    • 没关系,但请注意,就编译器而言,List&lt;Object&gt;List&lt;? extends Object&gt; 相同,OP 可能需要List&lt;Object&gt;
    • -1 正如 OP 所述,Arrays.&lt;Object&gt;asList(1,2.13,"three") 工作正常。问题是为什么编译器无法推断出Object,而不是如何破解解决方案。
    猜你喜欢
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多