Расширение примитивных преобразований, за которыми следуют конверсии бокса [дубликат]

Другой случай, когда это обычно нормально, находится в базе данных отчетов, где данные, возможно, уже поставлены и записи просто не происходят. В этом случае параметр должен быть установлен на уровне базы данных или таблицы администратором, изменив уровень изоляции по умолчанию.

В общем случае: вы можете использовать его, когда вы очень уверен, что читать старые данные можно. Важно помнить, что его очень легко получить это неправильно . Например, даже если в момент написания запроса все нормально, уверены ли вы, что в будущем в базе данных не будет изменений, чтобы сделать эти обновления более важными?

Я также сделаю предположение, что это, вероятно, не хорошая идея в банковском приложении. Или приложение инвентаризации. Или где бы вы ни думали о транзакциях.

8
задан Pawel Mercik 13 August 2014 в 18:27
поделиться

1 ответ

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

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) путем расширения примитивного преобразования.

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

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

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

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

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

6
ответ дан rgettman 24 August 2018 в 07:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: