将通用ArrayList设置为零

时间:2012-11-13 23:12:59

标签: java generics

我有一个ArrayList。我想将它的每个元素设置为0.现在我有:

ArrayList <T extends Number> arr = new ArrayList();

for(int i = 0; i < some_other_array.size(); i++)
{
    arr.add(0)
}

编译器抱怨

error: no suitable method found for set(int,int)
            arr.add(0);
               ^
    method ArrayList.set(int,T) is not applicable
      (actual argument int cannot be converted to T by method invocation conversion)
  where T is a type-variable:
    T extends Number

7 个答案:

答案 0 :(得分:2)

无法做到。方法签名是

 public T ArrayList<T>.set(int index, T element)

即使T上的约束是extends Number,但并不意味着它可以从数字构建。

例如,考虑一下

class FortyTwo extends Number {
      public byteValue() { return 42; }
      public intValue()  { return 42; }
      // etc
}

您希望初始化例程对ArrayList<FortyTwo>做什么?

答案 1 :(得分:1)

只需将列表声明更改为

即可
ArrayList<Number> arr = new ArrayList<Number>();

arr将能够持有任何延伸Number的东西(我想你应该这样做。)

现在,当你做

arr.set(i, 0)

0将自动装箱到Integer。 (请参阅自己,添加0并打印arr.get(0) instanceof Integer。)

例如,如果您想添加doublelong,则可以分别使用文字0d0L

答案 2 :(得分:0)

这适用于您的情况:arr.set(i, Integer.valueof(0));

或者您可以重复使用这个方便的标准API:Collections.fill(arr, Integer.valueof(0));

答案 3 :(得分:0)

尝试将ArrayList的声明更改为

ArrayList<Integer> arr = new ArrayList<Integer>();

Integer类支持自动装箱,而Number类则不支持。此外,add()方法可能更适用。

答案 4 :(得分:0)

为什么要将值设置为0,它将自动为零,因为ArrayList对象将被实例化。因此代码将无用,因为此时大小将为零,因此不会执行循环。

答案 5 :(得分:0)

好吧,我觉得你对ArrayList的实际运作方式感到有些困惑。创建ArrayList时,它始终为空。即使您指定了尺寸:

ArrayList<Integer> arr = new ArrayList<Integer>(20);

20仅表示“初始容量”,而非“起始元素数量”。因此,set永远不会起作用,因为根本没有元素。即使您修复了这样的编译器问题:

arr.set(i, Integer.valueOf(0));

或者像这样:

ArrayList<Number> arr = new ArrayList<Number>();

由于arr.size()为零,它甚至都不会做任何事情,因此for循环甚至不会运行。

此处的关键是ArrayList 不是实际数组。它包装一个数组,并在它有太多元素时扩展它的内部数组。换句话说,我不能这样做:

ArrayList<Integer> arr = new ArrayList<Integer>(20);
arr.get(0); // Throws an out of bounds exception

现在,话虽如此,如果您希望在ArrayList中以20个零开头,则可以在循环中使用add方法并{{1}而不是:

i < 20

这将为for(int i = 0; i < 20; i++) { arr.add(Integer.valueOf(0)); } 添加20个零。即使在修复错误之后,您的代码也不会。

答案 6 :(得分:-1)

你可以尝试这个(据我所知,你不能将原始类型添​​加到ArrayList):

ArrayList<Integer> arr = new ArrayList<Integer>();

for(int i = 0; i < someNumber; i++)
{
   arr.add(0);
}

请记住,当size为0时,因为它没有任何默认值,并且容量是您应该查看的内容(您可以在构造函数中设置容量。)