2011-11-15 8 views
55

Mi sono imbattuto in questa domanda in un'intervista e non sono riuscito a trovare una soluzione. So che il vice versa può essere fatto come mostrato in What does the "+=" operator do in Java?Come dichiarate xey in modo che x + = y dia un errore di compilazione e x = x + y no?

Quindi la domanda era come sotto.

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

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

Stranamente, java consente la concatenazione con il segno più? Non conosco java, ma sembra una possibilità – Ben

+0

@mazzzzz appena testato che, non sembra essere la soluzione qui. + = funziona bene per concatenare due stringhe. – mcfinnigan

+104

Che domanda di intervista inutile. –

risposta

55

Prova questo codice

Object x = 1; 
String y = ""; 

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

non del tutto sicuro perché questo funziona, ma il compilatore dice

L'operatore + = non è definito per il tipo di argomento (s) oggetto, String

e presumo che per la seconda riga, toString è ca poggiato sull'Oggetto.

EDIT:

Ha senso come l'operatore += è insignificante su un oggetto generale. Nel mio esempio ho lanciato un int ad un oggetto, ma dipende solo x essere di tipo Object:

Object x = new Object(); 

Funziona solo se x è oggetto, però, così io in realtà penso che sia più che String è un diretta sottoclasse di Object. Questo fallirà per x + y:

Foo x = new Foo(); 

per altri tipi che ho provato.

+0

Dann, va bene. – DJClayworth

+1

Grazie. Ho provato in Eclipse ed è come hai detto tu. Ma ho capito che in NetBeans si compila senza errori. Quindi, significa che non è un problema generale di java ma dipende dai compilatori? – knshn

+6

x + = y deve essere compilato se x è Object e y è String, vedi http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7058838 – x22

3

Non è possibile.

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

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

x = x+y;  //3 

Supponiamo il tipo di x+y è Z. # 2 richiede una conversione colata da Z a X; Il numero 3 richiede una conversione del compito da Z a X. "Le conversioni di casting sono più inclusive delle conversioni di assegnamento" (1). Pertanto, fino a quando # 3 è legale, # 2 è legale e # 1 è legale.

Sul retro, è possibile che # 1 è legale, ma # 3 è illegale, per esempio

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 

Questa informazione non è utile di sorta; è un difetto di Java che crea differenze così sorprendenti.

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

+4

È possibile, vedere la risposta di @Craigy. –

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

Fondamentalmente, funziona per qualsiasi oggetto o non stringa combinazione primitivo e stringa.

Mi chiedo quale società fosse?:)

+0

Questo non è veramente equivalente perché qui vengono convertiti in stringhe mentre sarebbero convertiti in un 'int' nel secondo caso con' i = i + s' che fornisce un errore di compilazione. – Craigy

1

Questa cosa non vi darà sempre errore di compilazione

Se si sta facendo smoething come questo:

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

che funzionerà bene

anche se si fa

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

funzionerà correttamente.

ma se si prende x e y due diversi tipi di variabili come:

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

In questi casi non riuscirà a compilare.

* Anche se è possibile concatinare qualsiasi int, float ecc. Con String.

+0

Ma in questo caso 'x + y' fallirà e non solo' x + = y'. – nikhil