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? :)