Вы должны вообще избегать вычисления смешанного типа;соединение с ?:
условно / троично только усугубляет ситуацию.
Вот цитата из Java Puzzlers , Puzzle 8: Dos Equis:
Вычисления смешанного типа могут сбивать с толку.Нигде это не так очевидно, как условное выражение.[...]
Правила определения типа результата условного выражения слишком длинны и сложны, чтобы воспроизвести их полностью, но вот три ключевых момента.
Если второй и третий операнды имеют одинаковый тип, то это тип условного выражения.Другими словами, вы можете избежать всего беспорядка, избегая вычислений смешанного типа.
Если один из операндов имеет тип T , где T равен byte
, short
или char
, а другой операнд является константным выражением типа int
, значение которого представимо в типе T , типе условного выраженияВыражение: T .
В противном случае двоичное числовое продвижение применяется к типам операндов, а тип условного выражения является продвинутым типом второго и третьего типов.операнды.
Точка 3 применяется здесь, и это привело к распаковке.Когда вы распаковываете null
, естественно, выдается NullPointerException
.
Вот еще один пример вычислений смешанного типа и ?:
, что может удивить:
Number n = true ? Integer.valueOf(1) : Double.valueOf(2);
System.out.println(n); // "1.0"
System.out.println(n instanceof Integer); // "false"
System.out.println(n instanceof Double); // "true"
Смешанный типвычисление является предметом как минимум 3 Java Puzzlers .
В заключение вот что Java Puzzlers предписывает:
4.1.Расчеты смешанного типа сбивают с толку
Предписание : Избегайте вычислений смешанного типа.
При использовании оператора ?:
с числовыми операндами используйте один и тот же числовой тип для обоихвторой и третий операнды.
О предпочтении примитивных типов примитивам в штучной упаковке
Вот цитата из Effective Java 2nd Edition, Item 49: Предпочитают примитивные типыв штучной упаковке примитивы :
В итоге, используйте примитивы вместо коробочных примитивов, когда у вас есть выбор.Примитивные типы проще и быстрее.Если вы должны использовать коробочные примитивы, будьте осторожны!Автобокс уменьшает многословность, но не опасность использования коробочных примитивов.Когда ваша программа сравнивает два коробочных примитива с оператором ==
, она выполняет сравнение идентификаторов, что почти наверняка не то, что вам нужно.Когда ваша программа выполняет вычисления смешанного типа с использованием коробочных и распакованных примитивов, она выполняет распаковку, а когда ваша программа выполняет распаковку, она может выдать NullPointerException
.Наконец, когда ваша программа упаковывает примитивные значения, это может привести к дорогостоящим и ненужным созданиям объектов.
Есть места, где у вас нет выбора, кроме как использовать примитивы в штучной упаковке, например, дженерики, но в противном случае вам следует серьезноподумайте, оправдано ли решение использовать штучные примитивы.
Смежные вопросы