Luk*_*uke 5 java arrays list arraylist long-integer
为什么我可以初始化ArrayList,如下所示:
ArrayList<Integer> x = new ArrayList<Integer>(Arrays.asList(1,2));
Run Code Online (Sandbox Code Playgroud)
但使用时出现错误:
ArrayList<Long> x = new ArrayList<Long>(Arrays.asList(1,2));
Run Code Online (Sandbox Code Playgroud)
Zab*_*uza 17
如果需要,Java会自动转换int为long.
但是,如果需要转换为,则Java 不会执行相同的操作.IntegerLong
该函数Arrays.asList(...)返回一个List<E>与E被用作参数的类型.当你使用1, 2, 3的类型是int.然而一般使用的数据类型为List<int>是不可能在Java中(至少目前).因此,自动将int到Integer,并产生一个List<Integer>对象.这个过程称为自动装箱,Java可以对所有数据类型执行此操作,以实现相应的对象表示.
如果你现在使用构造函数,new ArrayList<Integer>(List<E> list)它E应该是类型的东西Integer.所以一个List<Integer>作为输入.
但是当你使用时new ArrayList<Long>(List<E> list)显然E需要类型Long.然而,对象Integer是类型的不 Long因此它并不能接受的参数.的第一公共类型Integer和Long是抽象类Number(其也适用Double,Float和其它物质)(文档).
所以这一切都围绕着1, 2, 3被解释为的输入int而不是long.你可以通过明确告诉Java 解释数字来解决这个问题long,你可以通过追加l或L在数字后面来解释:
new ArrayList<Long>(Arrays.asList(1L, 2L, 3L));
Run Code Online (Sandbox Code Playgroud)
现在你收到一个List<Long>然后被添加到ArrayList<Long>.
请注意,可以使用相同的技术明确地将十进制数解释为:float而不是double:1.5F或1.5f
ass*_*ias 12
这是因为1并且2是整数并Arrays.asList(1, 2)创造了一个List<Integer>.
并且复制构造函数ArrayList要求参数具有相同的泛型类型.
您有几个选项,但最简单的方法是通过添加后缀将ints 更改为longs L:
List<Long> x = new ArrayList<Long>(Arrays.asList(1L, 2L));
Run Code Online (Sandbox Code Playgroud)
请注意,使用Java 9,您还可以编写:
List<Long> x = List.of(1L, 2L);
Run Code Online (Sandbox Code Playgroud)
您必须Long使用文字l或指定一个数字L.
ArrayList<Long> x = new ArrayList<Long>(Arrays.asList(1L, 2L));
Run Code Online (Sandbox Code Playgroud)