2015-04-22 4 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?

В ответ на ответ. (Спасибо, кстати, я думаю, что простой пример того, что я имею в виду, - это почему первая строка неявно бросает, а вторая - нет?

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

Мое понимание обоих правых частей делают character[] variabless

+0

Чтобы сделать его коротким: autoboxing от "примитивного массива типов" до "массива типа оболочки" отсутствует. – 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 от char к Character.

+0

Почему в моем втором примере используется использование '{'s', 't', 'r', 'i', 'n', 'g'}? Не возвращает ли этот тип 'char []'? –

+0

Каждое из значений, как я уже сказал, автобоксируется символу 'Character', что в итоге приводит к' Character [] '. Это особенность инициализатора массива –

+0

Ah. Я не понимал, что у него есть специальные правила https://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html#jls-10.6 Спасибо! –

Смежные вопросы