2015-04-22 40 views
9

我正在寻找将char的数组转换为字符的Set为什么不在这里发生隐式转换?

从逻辑上讲,如果我写出类似How to convert an Array to a Set in Java的东西,而不是使用内置函数,它将起作用。但是,使用内置的泛型函数不会。

TreeSet<Character> characterSet = Sets.newTreeSet(); 

    String myString = "string"; 
    Character [] characterArray = {'s','t','r','i','n','g'}; 


    Collections.addAll(characterSet,characterArray); // This works 
    Collections.addAll(characterSet,myString.toCharArray()); // This Does not 

为什么不把它转换的char阵列characters

作为后续答案。 (谢谢btw)我认为我的意思是一个简单的例子,为什么第一行隐式投射,但第二行不是?

Character [] characterArray = {'s','t','r','i','n','g'}; // works 
    Character [] characterArray2 = myString.toCharArray(); // does not work 

我的理解是两个右手边做character[] variabless

+0

简而言之:从“原始类型数组”到“包装类型数组”没有自动装箱。 – Tom

+0

你的意思是'myString.toCharArray()'与'{'s','t','r','i','n','g'}'是不同的类型。 –

+0

阅读@kocko关于这种情况的评论。 – Tom

回答

12

因为myString.toCharArray()将返回char[]这是不Character[]。你可以通过这个简单的测试验证:

char[] a = { 'a' }; 
Character[] b = { 'b' }; 
a = b; //doesn't work, because char[] is not a Character[] 

Character[] characterArray = {'s','t','r','i','n','g'};但是符合Collections.addAll(...),因为当数组初始化,每个值是autoboxed从charCharacter

+0

为什么在我的第二个例子中使用'{'s','t','r','i','n','g'}'然后呢?不是那种返回类型'char []'? –

+0

正如我所说的,每个值都被自动写入到“Character”中,最终导致“Character []”。这是数组初始化器 –

+0

的一个特性啊。我没有意识到它有特殊的规则https://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html#jls-10.6谢谢! –

相关问题