Java 存储非指定数据类型的ArrayList
我有一个类型为Long的ArrayList,但我正在尝试在其中插入int值。我希望int也应该存储在ArrayList中,因为int的大小小于LongJava 存储非指定数据类型的ArrayList,java,arraylist,Java,Arraylist,我有一个类型为Long的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 请说明ArrayList无法存储较低值类型的原因。您正在这样做: Long l =
int i=1;
ArrayList<Long> obj=new ArrayList<Long>();
obj.add(i);//It is showing error that Storing int is not possible
请说明ArrayList无法存储较低值类型的原因。您正在这样做:
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问题,请查看详细信息。这是:
ArrayList<Long> obj=new ArrayList<Long>();
arraylistobj=newarraylist();
声明列表将存储类型为Long
的对象。它存储引用,您不能将整数
放入,因为整数
不是长
(从对象层次结构的角度看)
不要用数字来思考这个问题。相反,试试这个。您有一个Cat
s列表。你不能在那里存放狗。但是,如果该列表被声明为动物列表
,则可以
您可以声明列表包含一个数字
(long
和Integers
都是数字
s),但最根本的问题是为什么要在这个集合中混合整数和long?您只需要将其强制转换为long即可使上述代码正常工作:
obj.add((long)i);
因为您指定ArrayList包含“Long”,所以它强制进入其中的所有对象都是Long。由于ArrayList可以用来存储任何类型的数据,而不仅仅是数字,因此它没有内置的机制来将整数转换为长整数。适用不同的规则
java原语,如int和Load,允许自动转换符合C和C++的工作方式,因为java最初是基于这些语言的。但它不会产生最干净/最安全的代码,因此其他一些更现代的语言甚至消除了这种模糊性
long
变量l
也不能存储较低的值类型。将i
赋值给l
将隐式执行a,并且该值存储为long
当您尝试将int
值插入列表
时,您隐含地尝试进行两种转换:
- 扩大原语转换(
int
到long
)
- (
long
至long
)
该双重转换将不会隐式应用,因此您必须通过使用强制转换强制执行加宽原语转换来告诉编译器执行该转换:
obj.add((long)i);
您已将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;
}
此外,在您的后半部分中,当您按以下方式分配时,=
操作符会处理强制转换:
l=i;
ArrayList
只能存储Long
的实例
您可以“显然”在其中存储long
s,因为long
自动装箱到long
:
list.add(someLong)
编译为
list.add(Long.valueOf(someLong))
仅适用于从原语到相应的包装类型:long
到long
,int
到Integer
等。但是,它不会将int
框到long
。编译器没有那么聪明/宽容
Java不会将整数
加宽为长
,因为加宽不是为这些类型定义的:它只为基本数字类型定义
您只需将参数设置为一个长
,然后它就可以为您自动装箱:
obj.add((long) i);
或者,在没有自动装箱的情况下:
obj.add(Long.valueOf(i));
注意,在后一种情况下,int
对于采用long
参数的方法来说是一个可接受的参数,因为这是加宽转换。加宽+自动装箱不受支持。因为自动装箱只将long
框到long
-它不能将int
框到long
。
obj.add((long) i);
obj.add(Long.valueOf(i));