Ваш метод объявляет, что тип возвращаемого значения String
.Любой оператор return
должен создавать выражение, совместимое с объявленным типом возвращаемого значения.
Однако в этом случае тип возвращаемого значения может быть int
, что объясняет, почему компилятор отклоняет его.
Это не относится к троичному оператору, его также можно воспроизвести с помощью эквивалентного блока if
/ else
:
if(distance < 1000)
return "train"; //This part is valid
else
return 10; //This line will be rejected by the compiler
По той же причине последняя строка не сможет выполнитькомпиляции.Это просто из-за базовой проверки типов.
System.out.println (расстояние <1000? "Train": 10);компилируется и запускается без проблем. </p>
Это связано с тем, что компилятор определяет общий тип для String
и int
, равный Object
, и разрешает выбрать эту сигнатуру:
java.io.PrintStream#println(Object x) // available in the target class
Это, однако, неприменимо к типу возвращаемого метода.
Если вы изменили тип возвращаемого значения на Object
, ваш код также будет компилироваться.Но это, конечно, не то, что вы пытаетесь сделать.
Для троичных операций требуется, чтобы оба правых выражения были совместимых типов данных
-> Эта частьна самом деле действует.Вот способ интерпретировать это: каждое из двух выражений должно быть индивидуально совместимо:
String value = distance > 1000 ?
"train" //this must be compatible with String
:
10 //this too must be compatible with String (it isn't)
В отличие от:
Object value = distance > 1000 ?
"train" //this must be compatible with Object (it is)
:
10 //this too must be compatible with Object (it is)
Другими словами, вызовзначение System.out.println(distance < 1000 ? "train" : 10)
аналогично последнему примеру выше, где ожидаемый тип совместим с обоими выражениями.