55 votes

Comment déclarez-vous x et y pour que x + = y donne une erreur de compilation et que x = x + y pas?

J'ai rencontré cette question dans une interview et je n'ai pas pu trouver de solution. Je sais que l'inverse peut être effectué comme indiqué dans Que fait l'opérateur "+ =" en Java?

Donc, la question était comme ci-dessous.

 ..... x = .....;
..... y = .....;

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

55voto

Craigy Points 7490

Essayez ce code

Object x = 1;
String y = "";

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

pas entièrement sûr de savoir pourquoi cela fonctionne, mais le compilateur dit

L'opérateur += est pas défini pour le type d'argument(s) de l'Objet, de la Chaîne

et je suppose que pour la deuxième ligne, toString est appelée sur l'Objet.

EDIT:

Il est logique que l' += opérateur est dénuée de sens sur un Objet général. Dans mon exemple, j'ai jeté un int à un Objet, mais il ne dépend x étant de type Objet:

Object x = new Object();

Il ne fonctionne que si x a fait l'Objet, donc en fait je pense qu'il est plus que String est une sous-classe directe de l'Objet. Cela ne fonctionne pas pour x + y:

Foo x = new Foo();

pour d'autres types que j'ai essayé.

3voto

irreputable Points 25577

Il n'est pas possible.

X x = ...;
Y y = ...;

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

x = x+y;        //3

Supposons que le type d' x+y est Z. #2 requiert l'un de la coulée de conversion de Z à X; #3 nécessite une cession de conversion de Z à X. "coulée conversions sont plus inclusive que la cession de conversions"(1). Par conséquent, tant que #3 est légal, #2 est légal, et n ° 1 est légal.

Sur le verso, il est possible que n ° 1 est légal, mais #3 est illégal, par exemple

    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

Cette information n'est pas utile que ce soit; il s'agit d'une faille de Java faire de telles différences surprenantes.

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

2voto

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

Fondamentalement, fonctionne pour tout objet ou toute primitive non-chaîne et combinaison de chaînes.

Je me demande quelle compagnie c'était? :)

1voto

GPRathour Points 3071

Cette chose ne vous donnera pas toujours d'erreur de compilation

Si vous faites quelque chose comme ceci:

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

Ça fonctionnera bien

même si tu le fais

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

cela fonctionnera correctement.

Mais si vous prenez x et y deux types différents de variables comme:

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

Dans ce cas, la compilation échouera.

* Même vous pouvez concatiner n'importe quel int, float, etc. avec String.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X