В следующем классе возвращаемый тип двух методов несовместим с идеей о том, что тернарный оператор:
return condition?a:b;
эквивалентно
if(condition) {
return a;
} else{
return b;
}
Первый возвращает двойной, а второй - длинный:
public class IfTest {
public static Long longValue = 1l;
public static Double doubleValue = null;
public static void main(String[] args) {
System.out.println(getWithIf().getClass());// outpus Long
System.out.println(getWithQuestionMark().getClass());// outputs Double
}
public static Object getWithQuestionMark() {
return doubleValue == null ? longValue : doubleValue;
}
public static Object getWithIf() {
if (doubleValue == null) {
return longValue;
} else {
return doubleValue;
}
}
}
Я могу себе представить, что это связано с тем, что компилятор ограничен, возвращая тип возвращаемого значения getWithQuestionMark()
, но насколько этот язык подходит? Это, конечно, не то, что я ожидал.
Любые идеи наиболее приветствуются!
Редактировать: там очень хорошие ответы ниже. Кроме того, следующий вопрос, на который ссылается @sakthisundar, исследует другой побочный эффект продвижения типа, возникающий у тройного оператора: Tricky trernary operator в Java - автобоксинг