0

我有一个数组列表。我想将它的每个元素设置为 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
4

7 回答 7

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
}

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

于 2012-11-13T23:30:33.143 回答
1

只需将您的列表声明更改为

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

arr将能够容纳任何扩展的东西Number(我假设这是你想要的)。

现在,当你这样做时

arr.set(i, 0)

0将被自动装箱为Integer. (自己看,添加0和打印arr.get(0) instanceof Integer。)

例如,如果您想添加doubles 或longs,您可以分别使用文字0d0L

于 2012-11-13T23:16:34.393 回答
0

尝试将 ArrayList 的声明更改为

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

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

于 2012-11-13T23:24:25.563 回答
0

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

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

于 2012-11-13T23:17:48.777 回答
0

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

于 2012-11-13T23:27:11.390 回答
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

现在,话虽这么说,如果你在你的 20 个零开始,你可以在你的循环ArrayList中使用该方法,而不是:addi < 20

for(int i = 0; i < 20; i++) {
    arr.add(Integer.valueOf(0));
}

这将为 . 添加 20 个零arr。您的代码,即使在修复错误之后,也不会。

于 2012-11-13T23:30:25.237 回答
-1

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

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

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

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

于 2012-11-13T23:15:09.807 回答