2015-04-22 43 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謝謝! –

相關問題