¿Por qué no puede ser utilizado operador ternario sin asignación (variable de la izquierda)?

mightyWOZ:

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
Andy Turner:

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 StatementExpressiones 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 StatementExpressions 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" ;

( ifEs 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";    

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=224348&siteId=1
Recomendado
Clasificación