我有一个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
答案 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
。)
例如,如果您想添加double
或long
,则可以分别使用文字0d
和0L
。
答案 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时,因为它没有任何默认值,并且容量是您应该查看的内容(您可以在构造函数中设置容量。)