2015-08-31 21 views
5
class MyClass { 

    private String str; 
    public MyClass(String str){ 
     this.str = str; 
    } 
    public int compare(Object o) { 
     return str.compareTo(((MyClass)o).str); //line No.8 
    } 
} 

class Client { 
    public static void main(String[] args) { 
     MyClass m = new MyClass("abc"); 
     MyClass n = new MyClass("bcd"); 
     System.out.println(m.compare(n)); 
    } 
} 

Perché in questo frammento di codice del cast (MyClass)o in linea numero 8 è necessario, nonostante il fatto che il client richiama un metodo compare con argomenti che sono istanze della classe MyClass?Perché il cast è necessario in questo caso?

Quando ho modificare il metodo compare in classe MyClass per formare come di seguito:

public int compare(Object o) { 
     System.out.println(o.getClass()); 
     System.out.println(((MyClass)o).getClass()); 
     return str.compareTo(((MyClass)o).str); 
    } 

Poi, il Cliente produrrà il seguente risultato:

class MyClass 
class MyClass 

Così io non capisco il motivo per cui il il cast sopra è obbligatorio e perché non posso farlo in questo modo (senza cast in MyClass):

public int compare(Object o) { 
     return str.compareTo(o.str); 
    } 

Perché quando lo faccio, ottengo l'errore di compilazione:

str cannot be resolved or is not a field 

risposta

8

Si tratta di ciò che il compilatore sa al tempo di compilazione. A compile time sa che ciò che verrà passato in questo metodo è di tipo Object. Ciò significa che può garantire i metodi associati alla classe Object, ma non i metodi di tipo MyClass.

Perché questo metodo compare prende qualsiasi argomento di tipo Object, o di una sottoclasse, si potrebbe passare nulla. Che se faccio una classe MyOtherClass come questo ..

public class MyOtherClass { 
    public String notStr; 
} 

E io fare qualcosa di simile ..

MyOtherClass myOtherClass = new MyOtherClass(); 
MyClass myClass = new MyClass(); 

myClass.compare(myOtherClass); 

senza il cast, ora che hai avuto una situazione in cui in fase di esecuzione, si tenta di accedere a un campo che non c'è. Il cast viene messo in atto per garantire che l'oggetto sia del tipo corretto, altrimenti fallirà prima che tenti di accedere a quel campo.

Proprio come un a parte

Ho lavorato a lungo con un linguaggio chiamato Groovy. È un linguaggio che essenzialmente si trova su Java, ma supporta cose come l'associazione dinamica e la digitazione libera (che è ciò che cercate qui). Se questo tipo di funzionalità è indispensabile per te, ti consigliamo di controllare lo documentation.

1

o 's tipo in compare è un Object. Ciò significa che il parametro potrebbe essere un'istanza MyClass, ma non è possibile. Object non ha alcun campo chiamato str (come quello che appartiene a MyClass), quindi non c'è modo di ottenere quel campo da esso, e quindi il codice non può essere compilato. Se lanci su MyClass, tuttavia, avrà un campo chiamato str e quindi sarà in grado di accedervi.

Problemi correlati