Условный оператор является выражением: у него есть результат:
int a = cond ? 1 : 2;
, но вы не можете использовать его следующим образом:
cond ? 1 : 2;
, потому что это не StatementExpression
;это очень похоже на то, что вы не можете написать ни одного из:
1;
2 * 3;
array[1];
, потому что они просто не служат какой-либо цели.
A StatementExpression
- это выражение, которое выможет выдавать ;
после, например:
int i = 0;
someMethod(i++); // Use of i++ as an expression.
i++; // Use of i++ as a StatementExpression.
Полный список StatementExpression
s можно найти в спецификации языка :
StatementExpression:
Assignment
PreIncrementExpression
PreDecrementExpression
PostIncrementExpression
PostDecrementExpression
MethodInvocation
ClassInstanceCreationExpression
Таким образом, вам не нужно иметь назначение: вы можете использовать условный оператор искусственным образом, например так:
(true ? new int[1] : null)[0]++;
(Не то чтобы я как-то выступал за хороший кодили каким-либо иным способом, просто указав, что это законно)
Что касается остальных ваших проблем: это просто сообщения, специфичные для реализации компилятора.Ваш компилятор использует неверный синтаксис и делает все возможное, чтобы помочь вам, но он не очень хорошо справляется.
Обратите внимание, что другие компиляторы (например, тот, который используется Ideone) выдают совершенно разные сообщения.
Первая форма должна быть написана с использованием if / else:
if (stuff.equals ("TV")) res= "Walter" else res = "White" ;
(кстати, if
- это утверждение)
Во второй просто не хватает некоторыхкруглые скобки:
res = stuff.equals("TV")?(res="WALTER"):(res="WHITE");
Хотя назначения во втором и третьем операндах все равно избыточны:
res = stuff.equals("TV")?"WALTER":"WHITE";