我试图将int
数组转换为Set<Integer>
。
int[] arr = {5, 2, 7, 2, 4, 7, 8, 2, 3};
Set<Integer> s = new HashSet<Integer>(Arrays.asList(arr));
但是编译器不接受上面的代码。它说:“构造函数HashSet(List)是未定义的。”好吧,我认为int
应该自动生成。
我稍微修改了代码,将int
更改为String
:
String[] arr = {"hello", "world"};
Set<String> s = new HashSet<String>(Arrays.asList(arr));
此代码可以正常工作。
我尝试了以下操作,将int
更改为Integer
:
Integer[] arr = {5, 2, 7, 2, 4, 7, 8, 2, 3};
Set<Integer> s = new HashSet<Integer>(Arrays.asList(arr));
这是通过汇编。
我的问题是:为什么java编译器不接受第一个代码?
答案 0 :(得分:3)
int[] arr = {5, 2, 7, 2, 4, 7, 8, 2, 3};
Set<Integer> s = new HashSet<Integer>(Arrays.asList(arr));
由于您的Set
类型为Integer
(对象),array
类型为int
(原始)。
Arrays.asList() // takes in put as Generics
Java
中的泛型不适用于primitive
中的int
类型。这就是您收到此错误的原因。
答案 1 :(得分:2)
您的问题是致电Arrays.asList(arr)
。它使用原始数组而感到困惑。 Java以不同的方式处理原语和对象。
asList只知道对象的数组,在你的情况下,它将整个数组视为一个单独的元素。也就是说,asList(arr)
正在返回Set<int[]>
,以下情况属实:
Set<int[]> s = new HashSet<Integer>(ints);
这不是你的意思。
Java中没有原始数组的自动装箱。最快的解决方法是使用Integer而不是int作为输入数组:
Integer[] arr = {5, 2, 7, 2, 4, 7, 8, 2, 3}; // java supports autoboxing when declaring an array
Set<Integer> s = new HashSet<Integer>(Arrays.asList(arr));
否则你将不得不迭代并自己添加元素。
int[] arr = {5, 2, 7, 2, 4, 7, 8, 2, 3};
Set<Integer> s = new HashSet<Integer>();
for ( int v : arr ) {
s.add(v); // autoboxing of a single int is supported by Java, and happens here
}
答案 2 :(得分:1)
在java容器中想要&#34;对象&#34;和原始人不是从对象派生的。泛型允许你假装没有包装,但你仍然支付拳击的性能价格。这对许多程序员来说非常重要。
列表清单;这也是为什么有原始类型的包装类的原因:
int -> Integer
boolean -> Boolean
double -> Double
byte -> Byte etc...