【问题标题】:Integer extends Number整数扩展数字
【发布时间】:2014-01-05 17:40:53
【问题描述】:

现在在这段代码中,我显然可以遍历列表,因为 IntegersDouble 都是从 Number 扩展的 超类按预期完美运行:

public static void viewList(List<? extends Number> num) {
    for (Number num1 : num) {
        System.out.println(num1);
    }
}

public static void main(String[] args) {

    List<Integer> arl = new ArrayList<Integer>();
    viewList(arl);

}

但是在这里将数据添加到集合中将永远无法工作,因为 Integer 和 Double 不是 Number 和的超类

我了解 PECS 概念(Producer Extends Consumer Super)

public static void addList(List<? super Number> num) {
    num.add(1);
    num.add(2);
    num.add(3);
}

public static void main(String[] args) {

    List<Integer> arl = new ArrayList<Integer>();
    addList(arl);

}

正如预期的那样,我在这里遇到了一个错误,那么如何以正确的方式进行操作所以我将能够在集合中添加我想要的任何类型?

【问题讨论】:

  • 你为每个你想要的Number子类型重载方法。
  • 是的,这就是我已经做过的,但是有没有更有效的更少编码的方法?

标签: java collections


【解决方案1】:

List&lt;? super Number&gt; 表示 Number 列表,或继承树中高于 Number 的类型。所以

  • List&lt;Number&gt; 限定:您可以将任何类型的数字添加到 List&lt;Number&gt;
  • List&lt;Serializable&gt; 限定:您可以将任何类型的数字添加到 List&lt;Serializable&gt;
  • List&lt;Object&gt; 限定:您可以将任何类型的数字添加到 List&lt;Object&gt;
  • List&lt;Integer&gt; 不符合条件:您不得将任何类型的数字添加到 List&lt;Integer&gt;

【讨论】:

  • 那么除了重载我要使用的类型,没有其他解决方案了吗?
  • 你没有真正解释你想要达到的目标。也许你的方法应该是通用的:public static &lt;T extends Number&gt; void addList(List&lt;T&gt; list, T valueToAddToTheList)
  • 我想要实现的是,从我的主要方法中,我可以拥有 ArrayList ArrayList 并且能够使用一种方法向它们添加数据
  • 添加哪些数据?这些数据从哪里来?您的示例将 3 个硬编码整数写入列表。您显然不能将 Integer 实例写入 List,因为 Integer 不会扩展 Double。
  • 更准确地说,如果 Integers 和 Double 都是从 Number 扩展而来,这意味着我们可以创建一种方法,比如说 AddIntoList(List data) { data.add(1);将数字添加到集合 ArrayList ar1; ArrayList ar2;然后使用 AddIntoList(ar1), AddIntoList(ar2) 对吗?或者我没有得到什么?还是“1”在这里不被视为数字?
【解决方案2】:

也许你应该收集对象并使用适当的转换

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-18
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 2012-02-15
    • 2014-11-18
    相关资源
    最近更新 更多