Самый быстрый способ сглаживать / не сглаживать вложенные объекты JSON

Я попытался дублировать это с более широкой группой контекстов присваивания:

final byte b = 12;
Byte b2 = b;
Character c = b;  // Only an error if b isn't final
char c2 = b;      // Only an error if b isn't final
Short s = b;      // Only an error if b isn't final
short s2 = b;
Integer i = b;  // Error, as indicated in the question
int i2 = b;
Long l = b;     // Also an error
long l2 = b;
Float f = b;    // Also an error
float f2 = b;
Double d = b;   // Also an error
double d2 = b;

Назначение не только для Integer, но и для Float, a Long или Double также является ошибкой.

Интересно, что если исходное объявление b было NOT final, то при присвоении Character, char или Short .

Раздел 5.2 JLS проливает немного света на предмет контекстов назначения и их разрешенные преобразования.

Контексты назначения позволяют использовать одного из следующих:

  • преобразование идентичности (§5.1.1)
  • расширение примитивного преобразования (п. 5.1.2)
  • a (§5.1.5)
  • преобразование бокса (§5.1.7), за которым следует расширенное ссылочное преобразование
  • преобразование для распаковки (п. 5.1.8) путем расширения примитивного преобразования.
blockquote>

Это охватывает все преобразования для более простых примитивных переменных, которые всегда разрешены, независимо от того, b - final или нет. (Это выполняется, если b не является отрицательным, и в этом случае сбой при отсутствии знака char (или Character).) Продолжение:

Кроме того, если выражение постоянное выражение (§15.28) типа byte, short, char или int:

  • Сужение примитивного преобразования может быть использовано, если тип переменной является байтом, коротким или char, и значение константного выражения представляется в типе переменной.
  • Сужение примитивного преобразования, за которым следует преобразование бокса, может использоваться, если тип переменной: Byte и значение константного выражения представляется в байте типа. Короткое значение, а значение константного выражения представляется в типе short. Символ и значение константного выражения представляются в типе char.
blockquote>

Поскольку b является final, выражение b является константным выражением , позволяя ему сужаться от int постоянное выражение 12 - byte, char или short, а затем помечено в поле Byte, Character или Short, но странно, а не Integer или что-либо «выше». Единственное возможное объяснение, о котором я могу думать, состоит в том, что константные выражения, которые подвержены примитивному суживающему преобразованию, не могут быть явно разрешены к Integer, Long, Float или Double.

Если b не final, то сужение, сопровождаемое боксом, недопустимо, а не константное выражение не может быть продвинуто с byte до char.

142
задан Louis Ricci 7 October 2013 в 14:04
поделиться