2009-07-15 9 views
5

Ho difficoltà a comprendere questa domanda e la spiegazione della risposta per una domanda di autodiagnostica SCJP 1.6. Ecco il problema:Var-arg di matrici di oggetti e array di oggetti - tentativo di comprendere una domanda di autodiagnosi SCJP

class A { } 
class B extends A { } 
public class ComingThru { 
    static String s = "-"; 
    public static void main(String[] args) { 
     A[] aa = new A[2]; 
     B[] ba = new B[2]; 
     sifter(aa); 
     sifter(ba); 
     sifter(7); 
     System.out.println(s); 
    } 
    static void sifter(A[]... a2) { s += "1"; } 
    static void sifter(B[]... b1) { s += "2"; } 
    static void sifter(B[] b1) { s += "3"; } 
    static void sifter(Object o) { s += "4"; } 
} 

Qual è il risultato? La risposta è -434, ma ciò che mi sconcerta è la spiegazione del libro. È molto diverso da come il concetto è stato spiegato in precedenza nel capitolo.

"In generale, var-args sovraccarichi metodi sono scelti ultimo. Si ricordi che array sono oggetti. Infine, un int può essere inscatolato in un intero e poi 'allargato' per un oggetto."

Suddivisione, qualcuno può per favore definire ulteriormente tale spiegazione?

  1. In generale, i metodi var-args sovraccarichi vengono scelti per ultimi.
  2. Gli array sono oggetti (in realtà lo capisco, ma perché questo è rilevante per questa domanda).
  3. Un int può essere inserito in un intero e quindi "allargato" a un oggetto.

Grazie!

risposta

6

Il libro sta cercando di spiegare il motivo per cui i primi due sovraccarichi non vengono mai selezionati: poiché il marcatore var-args ... li utilizza solo se ogni altro possibile sovraccarico non riesce. In questo caso, questo non accade - le due frasi che iniziano con "Ricorda" sta spiegando PERCHÉ non accade, perché esistono altri possibili sovraccarichi nel primo e nell'ultimo caso (il secondo caso e la sua corrispondenza con il terzo sovraccarico di sifter è ovvio): un array è un oggetto e un int può essere riquadrato e poi allargato a un oggetto, quindi il quarto sovraccarico corrisponde al primo e all'ultimo delle chiamate al sifter.

+0

Grazie per l'ottima spiegazione! –

+0

@ hal100001, sempre felice di aiutare - una volta che tutte le risposte sono in, ricordati di selezionare il migliore/più utile per l'accettazione (come dici tu, anche l'msaeed è molto utile - stiamo dicendo essenzialmente le stesse cose ovviamente , ma la mia espressione è più colloquiale, la sua, più strutturata). –

4
  1. Quando si tenta di determinare quale metodo per richiamare il compilatore cerca primo metodo non vararg (es sifter(Object)) prima di considerare un vararg uno (es sifter(A[]...)), quando entrambi i metodi appartengono alla stessa classe (more o meno).

  2. Poiché un array è un Object, l'invocazione di sifter(aa) corrisponderà sifter(Object), quindi non anche considerando sifter(A[]...).

  3. partire da Java 5, il compilatore può "box" primitivo, cioè convertire valori di base (ad esempio int) al corrispondente Object (ad esempio Integer). Quindi, per sifter(6), il compilatore converte lo int 6 in un Integer 6, quindi corrisponderebbe al metodo sifter(Object).

+0

Fantastica spiegazione. Grazie!!! –