short и char авто распаковка в java - PullRequest
0 голосов
/ 28 октября 2018
   HashSet charSet = new HashSet();
   for (char i = 0; i < 100; i++) {
      charSet.add(i);
      charSet.remove(i - 1);
    }
    System.out.println(charSet.size());

    HashSet intSet = new HashSet();
    for (int i = 0; i < 100; i++) {
        intSet.add(i);
        intSet.remove(i - 1);
    }
    System.out.println(intSet.size());

Выход 100 и 1 соответственно.

Я только что понял, что short и char не распаковываются автоматически в Java.Почему дизайнеры не думают, что это важно сделать?

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Я только что понял, что short и char не распаковываются автоматически в Java.Почему дизайнеры не думают, что это важно сделать?

Что бы ни привело вас к такому выводу, оно неверно.

Оба short и char могутможно найти в JLS Sec 5.1.8, преобразование Unboxing .

Легко написать код, который демонстрирует, что как char, так и short подвергаются как автоматической блокировке, так и автоматической распаковке:

Short ss = (short) 0;  // Autoboxing short to Short
short s = ss;          // Auto unboxing Short to short

Character cc = '\0';   // Autoboxing char to Character
char c = cc;           // Auto unboxing Character to char

Идеальная демонстрация

0 голосов
/ 28 октября 2018

Это на самом деле не имеет ничего общего с упаковкой или распаковкой.

Когда вы применяете арифметическую операцию к char, она преобразуется в int согласно JLS §5.6.2 :

Расширяющее примитивное преобразование (§5.1.2) применяется для преобразования одного или обоих операндов, как указано в следующих правилах:
  • Если один из операндов имеет тип double, другой преобразуется в double.
  • В противном случае, если один из операндов имеет тип float, другой преобразуется в float.
  • В противном случае, если один из операндов имеет тип long, другойпреобразуется в long.
  • В противном случае оба операнда преобразуются в тип int.

Таким образом, i - 1 не являетсяchar, но int.И поскольку в ваших charSet нет Integer (только Character s), удалить нечего.Если бы вы разыграли i - 1 до char, вы бы получили ожидаемый результат.

...