我有 ArrayList 类型长,但我想在其中插入 int 值。我期待int也应存储在ArrayList 中,因为int的大小小于long。
int i=1;
ArrayList<Long> obj=new ArrayList<Long>();
obj.add(i);//It is showing error that Storing int is not possible
以下是可能的
列出项目
long l=0;
int i=5;
l=i;
请说明ArrayList无法存储较低值类型的原因。
答案 0 :(得分:0)
你这样做:
Long l = 0L;
int i = 5;
l=i;//Type mismatch: cannot convert from int to Long
不是这个:
long l = 0;
int i = 5;
l = i;
这不是ArrayList问题,请查看this了解详细信息。
答案 1 :(得分:0)
您只需要将其强制转换为上述代码即可:
obj.add((long)i);
因为您指定ArrayList包含“Long”,所以它会强制进入它的所有对象都为Long。由于ArrayList可用于存储任何类型的数据,而不仅仅是数字,因此它没有内置机制来将int转换为long。适用不同的规则。
Java原语(如int和long)允许自动转换符合C和C ++的工作方式,因为Java最初基于这些语言。但它并没有导致最干净/最安全的代码,因此其他一些更现代的语言甚至已经消除了这种类型的虚假。
答案 2 :(得分:0)
long
变量l
也无法存储较低价值的类型。将i
分配给l
将隐式执行Widening Primitive Conversion,并将值存储为long
。
当您尝试将int
值插入List<Long>
时,您隐含地尝试进行两次转换:
int
至long
)long
至Long
)不会隐式应用双重转换,因此您必须通过使用强制转换强制扩展基元转换来告诉编译器执行此操作:
obj.add((long)i);
答案 3 :(得分:0)
您已将obj
声明为Long
的列表,因此限制您使用add
/**
* Appends the specified element to the end of this list.
*
* @param e element to be appended to this list
* @return <tt>true</tt> (as specified by {@link Collection#add})
*/
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
注意 - 其中E
来自班级定义ArrayList<E> extends AbstractList<E>
主要仅添加列表应包含的类型。因此,如下更改代码应该有效:
int i=1;
ArrayList<Long> obj=new ArrayList<Long>();
obj.add(Long.valueOf(i));
同样在你的后半部分,当您按照以下方式分配时,=
运算符会对投射进行处理:
l=i;
答案 4 :(得分:0)
ArrayList<Long>
只能存储Long
。
您可以“显然”在其中存储long
,因为long
已自动装箱到Long
:
list.add(someLong)
编译为
list.add(Long.valueOf(someLong))
Boxing conversion仅适用于原语到相应的包装类型:long
到Long
,int
到Integer
等。它不会包含{{然而,1}}到int
。编译器不是 smart / lenient。
Java并没有将Long
扩展为Integer
,因为没有为这些类型定义扩展:它仅为原始数字类型定义。
您只需将参数设为Long
,然后就可以为您自动停止:
long
或者,没有自动装箱:
obj.add((long) i);
注意,在后一种情况下,由于转换范围扩大,obj.add(Long.valueOf(i));
是采用int
参数的方法的可接受参数。不支持扩展+自动装箱。