He buscado para esto y hay algunas preguntas sobre el mismo problema, pero ninguna de las respuestas a estas preguntas parecen dirigir mi consulta.
He buscado la especificación y logrado encontrar los siguientes puntos:
primera expresión a ternario debe ser de tipo booleano
segunda y tercera expresiones no pueden estar llamadas a métodos vacíos.
teniendo en cuenta la información anterior si escribo el código siguiente
String res;
System.out.println(res="walter");
Walter se imprime a la consola, es decir, la expresión devuelta algo por lo tanto, no es nula. pero ahora si trato de escribir este
String stuff = "TV";
String res=null;
stuff.equals ("TV") ? res= "Walter" : res = "White" ;
este código falla al compilar con el lado izquierdo de una asignación debe ser una variable
A pesar de que las dos condiciones anteriores se cumplen (al mejor de mi conocimiento). por qué el código no compila y por qué se requiere una variable de la izquierda?
Por otra parte, si lo hago
res = stuff.equals("TV")?res="WALTER":res="WHITE";
el código falla al compilar con
El operador <= no está definida para el tipo de argumento (s) java.lang.String, java.lang.String
Sin embargo, tras compila bien
res = stuff.equals("TV")?res="WALTER":"WHITE";
PD
- ¿Por qué tiene que ser variable en el lado izquierdo del operador ternario, los valores de retorno del método pueden ser descartadas por qué no puede hacerse esto en el caso de ternaria.
- ¿Por qué Java no lo permite, ¿qué problemas o inconsistencias va a causar si se permite
El operador condicional es una expresión: tiene un resultado:
int a = cond ? 1 : 2;
pero no se puede utilizar de esta manera:
cond ? 1 : 2;
porque no es una StatementExpression
; esto es lo mismo que el hecho de que no se puede escribir cualquiera de:
1;
2 * 3;
array[1];
porque simplemente no sirve a ningún propósito.
Una StatementExpression
es una expresión que se puede hacer estallar una ;
tras, por ejemplo:
int i = 0;
someMethod(i++); // Use of i++ as an expression.
i++; // Use of i++ as a StatementExpression.
La lista completa de StatementExpression
s se puede encontrar en la especificación idioma :
StatementExpression:
Assignment
PreIncrementExpression
PreDecrementExpression
PostIncrementExpression
PostDecrementExpression
MethodInvocation
ClassInstanceCreationExpression
Como tal, usted no tiene que tener una misión: se puede utilizar el operador condicional de manera artificial como este:
(true ? new int[1] : null)[0]++;
(No es que yo soy de ninguna manera la defensa de este código tan bueno, o de cualquier manera útil; simplemente señalando que es legal)
En cuanto al resto de sus problemas: estos son sólo mensajes del compilador de la implementación específica. Su compilador está tropezar con la sintaxis no válida, y haciendo todo lo posible para ayudarle, pero no está haciendo un trabajo especialmente bueno.
Tenga en cuenta que otros compiladores (por ejemplo, la utilizada por Ideone) dan totalmente diferentes mensajes.
La primera forma debe ser escrito utilizando un if / else:
if (stuff.equals ("TV")) res= "Walter" else res = "White" ;
( if
Es una declaración, por cierto)
El segundo es sólo faltan algunos paréntesis:
res = stuff.equals("TV")?(res="WALTER"):(res="WHITE");
A pesar de las asignaciones en el segundo y tercer operandos son de todos modos redundante:
res = stuff.equals("TV")?"WALTER":"WHITE";