paquete libreria java operators shorthand

libreria - paquete java swing



¿Cómo declara xey para que x+= y dé un error de compilación y x=x+y no? (4)

Esto no siempre te dará error de compilación.

Si estás haciendo smoething así:

class A{ public static void main(String args[]){ String x = "10"; String y = "s"; x += y; System.out.println(x); } }

Funcionará bien

incluso si lo haces

class A{ public static void main(String args[]){ int x = 10; float y = 11.5F; x += y; System.out.println(x); } }

funcionará correctamente

Pero si tomas x e y dos tipos diferentes de variables como:

class X{ } class A{ public static void main(String args[]){ X x = new X(); float y = 11.5F; x += y; System.out.println(x); } }

En tales casos no se compilará.

* Incluso puedes concatinar cualquier int, flotar, etc. con String.

Me encontré con esta pregunta en una entrevista y no pude encontrar una solución. Sé que lo contrario se puede hacer como se muestra en ¿Qué hace el operador "+ =" en Java?

Así que la pregunta era como abajo.

..... x = .....; ..... y = .....; x += y; //compile error x = x + y; //works properly


No es posible.

X x = ...; Y y = ...; x += y; //1 //equivalent to x = (X) (x+y); //2 x = x+y; //3

Supongamos que el tipo de x+y es Z. # 2 requiere una conversión de conversión de Z a X; El # 3 requiere una conversión de asignación de Z a X. "las conversiones de conversión son más inclusivas que las conversiones de asignación" (1). Por lo tanto, siempre que # 3 sea legal, # 2 es legal y # 1 es legal.

En el reverso, es posible que # 1 sea legal, pero # 3 es ilegal, por ejemplo

byte x = 0; int y = 1; x+=y; // ok, x=(byte)(x+y), cast int to byte is allowed. x = x+y; // error, assign int to byte

Esta información no es útil en absoluto; Es un defecto de Java haciendo tan sorprendentes diferencias.

(1) http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.5


Prueba este codigo

Object x = 1; String y = ""; x += y; //compile error x = x + y; //works properly

No estoy completamente seguro de por qué esto funciona, pero el compilador dice

El operador + = no está definido para el tipo de argumento (s) Objeto, Cadena

y asumo que para la segunda línea, toString se llama en el objeto.

EDITAR:

Tiene sentido ya que el operador += tiene sentido en un Objeto general. En mi ejemplo, lanzo un int a un objeto, pero solo depende de que x sea ​​de tipo Object:

Object x = new Object();

Sin embargo, solo funciona si x es Object, por lo que creo que es más que String es una subclase directa de Object. Esto fallará para x + y :

Foo x = new Foo();

Para otros tipos que he probado.


int i = 5; String s = "a"; System.out.println(i+=s); //Error System.out.println(i+s); // No error

Básicamente, funciona para cualquier objeto o cualquier combinación de cadena y cadena no primitiva.

Me pregunto qué compañía fue? :)