2016-11-16 4 views
-1

ich A simple Box Class lese, und ich gestolpert zu diesem Code:java: erwartet Runtime aber nicht passieren

public class Box { 
    private Object object; 
    public void set(Object object) { this.object = object; } 
    public Object get() { return object; } 
} 

Wie der Autor in A simple Box Class erwähnt,

Es gibt keine Möglichkeit zu überprüfen, , zur Kompilierzeit, wie die Klasse verwendet wird. Ein Teil des Codes kann eine Ganzzahl in die Box einfügen und erwarten, dass Integer daraus entfernt wird, während ein anderer Teil des Codes fälschlicherweise eine Zeichenfolge übergeben kann, was zu einem Laufzeitfehler führt.

Aber wenn ich diesen Code testen und auszuführen:

public class checkBox { 

public static void main(String[] args){ 
    Box box = new Box(); 
    box.set(new Integer(3)); 
    System.out.println(box.get()); 
    box.set("test"); 
    System.out.println(box.get()); 
} 

Es läuft gut, ohne Fehler, und es ist das, was ich erwartet habe, weil in Java kein Problem es bei der Zuordnung von unterschiedlichem Typ Variablen eine ist Objektreferenz (auch Polymorphie geht hier, denke ich).

Was also meint der Autor mit diesem Satz? Was vermisse ich?

+1

Das Risiko besteht, wenn Sie schreiben 'String s = (String) box.get()', aber Sie zuvor eine Ganzzahl in es setzen – AxelH

+0

Der Code funktioniert durch Aufrufen von 'println (Object)' beide Male, obwohl auch ein vorhanden ist 'println (String)'. Dies geschieht, weil 'get()' deklariert wird, um 'Object' zurückzugeben. Dies funktioniert, weil 'println (Object)' auch Strings korrekt behandelt. –

Antwort

2

Diese Klasse (nicht generisch im Sinne von Java 5 und höher) kann für jede Art von Objekt verwendet werden. So könnte man leicht schreiben:

box.set(new Integer(47)); 
String s = (String)box.get(); 

, die zu einem ClassCastException zur Laufzeit führen würde (was höchstwahrscheinlich durch „Runtime Error“ gemeint ist).

Ich empfehle etwas über "echte" Generics in Java zu lesen, die bei der Erkennung dieser Art von Problemen zur Kompilierzeit hilft. Klassen wie die Klasse "Box" hätten einen Type Parameter, der den Typ des enthaltenen Objekts angibt.

Edit: Nach Überprüfung der verlinkten Artikel (ja, ich hätte vorher getan), die Box-Klasse ist genau ein "schlechtes Beispiel" für warum Generics verwendet werden sollte, nicht ein Beispiel für eine generische Klasse.

+0

Nun, das könnte eine Box sein, um was immer Sie wollen (nicht gut) und arbeiten mit dem Ergebnis je nach Typ. Bei Generika müssen Sie auf der Grundlage des gewünschten Typs eine neue Instanz erstellen. Hier können Sie diese Instanz problemlos freigeben. Das hat ** einige ** Vorteile;) – AxelH

Verwandte Themen