Java 存储非指定数据类型的ArrayList

Java 存储非指定数据类型的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 =

我有一个类型为LongArrayList,但我正在尝试在其中插入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 = 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));