【问题标题】:generic method write to a list通用方法写入列表
【发布时间】:2015-12-08 17:26:08
【问题描述】:

我正在尝试创建一个通用方法,它接受以下格式的数字列表。我知道我应该能够将任何类添加到列表“o”中,该列表至少是一个数字(浮点数、整数、双精度数)但我也应该能够添加任何对象,因为所有类都从对象扩展。换句话说,对象是任何类的超类。所以我想知道,为什么我会在 o.add(p); 行出现错误。 ?

public int checkType(List<? super Number> o) 
{
   Object p = new Object();
   //error
   o.add(p);
   return - 1;
 }

我遵循了Difference between <? super T> and <? extends T> in Java 对泛型的解释,这是公认的答案。

【问题讨论】:

  • 错误信息是什么?
  • @kocko 这个问题不是重复的
  • @Ferdinand Nema 见上文
  • 我认为应该是List&lt;? extends Number&gt; o作为参数。因此它适用于任何扩展 Number 的对象,例如那些原生包装对象。
  • @kocko 看我的解释

标签: java generics


【解决方案1】:

类型参数List&lt;? super Number&gt; o 指定任何可以包含NumberList 都可以传递给它。

可以是List&lt;Object&gt;,也可以是List&lt;Number&gt;

因此编译器将只允许您向其中添加 Number(或子类型)对象。

要进行测试,请使用以下参数调用您的方法。

checkType(new ArrayList<Object>()); // Works fine (and it can hold Object type).
checkType(new ArrayList<Number>()); // Works fine (But it can NOT hold Object type).

所以,如您所见,List&lt;? super Number&gt; 表示您正在尝试将 Number 添加到列表中(PECS 规则)。

【讨论】:

  • checkType(new ArrayList());工作正常,但随后 o.add(p);还是不行!
  • @george,这就是 PECS 的全部意义...参数不仅限于List&lt;Object&gt;...但List&lt;Number&gt; 也...而且您不能将对象放入@ 987654332@..所以编译器错误...
【解决方案2】:

一个考虑因素?

List<Object> myObjectList = Arrays.asList(1, 2, new SuperObject(), 4, 5);

Java 标配有一个实用程序类 Arrays

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多