2014-09-24 37 views
0

我试图将int数组转换为Set<Integer>在将数组转换为在java中设置时编译错误

int[] arr = {5, 2, 7, 2, 4, 7, 8, 2, 3}; 
Set<Integer> s = new HashSet<Integer>(Arrays.asList(arr)); 

但编译器不接受上面的代码。它说:“构造函数HashSet(List)是未定义的。”那么,我认为int应该是autoboxed。

我稍微修改了代码,更改intString

String[] arr = {"hello", "world"}; 
Set<String> s = new HashSet<String>(Arrays.asList(arr)); 

此代码的工作好了。

我尝试以下,改变intInteger

Integer[] arr = {5, 2, 7, 2, 4, 7, 8, 2, 3}; 
Set<Integer> s = new HashSet<Integer>(Arrays.asList(arr)); 

这是通过编译。

我的问题是:为什么java编译器不接受第一个代码?

+0

这可能会帮助你。 HTTP://计算器。com/questions/25890806/java-understanding-arrays-aslistt-array-method-for-primitive-types – ares 2014-09-24 10:05:50

回答

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 
} 
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()

Arrays.asList() // takes in put as Generics 

泛型Java并不适用于primitive类型为int。这就是你得到这个错误的原因。

+1

'Arrays.asList(arr)'返回'Integer'列表。集合不支持基元。 – 2014-09-24 09:41:46

+1

@sᴜʀᴇsʜᴀᴛᴛᴀ - 我正要说出同样的观点:) – TheLostMind 2014-09-24 09:43:03

+0

@sᴜʀᴇsʜᴀᴛᴛᴀ问题与返回类型无关,在'asList()'输入类型中发出' – 2014-09-24 09:50:49

1

在java容器中想要“对象”和原语不是从Object派生的。泛型允许你假装没有包装,但你仍然支付拳击的性能价格。这对许多程序员来说很重要。

List list;这也是为什么有基本类型的包装类的原因:

int -> Integer 

boolean -> Boolean 

double -> Double 

byte -> Byte etc...