2017-04-04 1 views
2

Edit: Ich stoße auf dieses Problem, wenn ich ein Objekt klonen muss, und ich habe gesucht, aber keine Frage mein Problem zu lösen.Java: Typ vor dem Klon schreiben?

Als ich das Prototyp-Muster in Java lernte, folgte ich einigen Tutorials und bin verwirrt über die Typ-Casting von (Bike)super.clone().

Was wird zuerst gemacht? (Bike)super oder super.clone()? Warum wird (Bike) benötigt?

public interface Prototype extends Cloneable 
{ 
    public Prototype clone() throws CloneNotSupportedException; 
} 

public class Bike implements Prototype 
{ 
    // Constructor and other methods... 

    // My question is here 
    public Prototype clone() throws CloneNotSupportedException { 
     return (Bike)super.clone(); 
    } 
} 
+1

Mögliches Duplikat von [Java-Casting-Reihenfolge] (http://stackoverflow.com/questions/5762270/java Casting-Order) – Tom

Antwort

2

Die Besetzung hat eine geringere Priorität als Funktion aufruft:

(Foo) a.f1().f2().f3() // Casts to Foo at the end of the calls chain 

In Ihrem Fall ist die Besetzung erforderlich, da Sie super.clone() anrufen, die ein Verfahren von Object.clone() geerbt, die gibt ein Object

+0

Ich stimme dir zu, weil ich einen Abstand zwischen '(Foo)' und 'a' gefunden habe, was mir hilft, mich an den Punkt zu erinnern. – user7813604

2

Die Klasse super.clone() führt zuerst, dann wird das Ergebnis unter Verwendung von Guss (Bike) (Casts auf das Ergebnis des Ausdrucks angewendet werden, die folgt).

Sie benötigen die Besetzung, weil Sie Object#clone() überschreiben, die auf Vorgenerika JDK1.0 zurückgeht und einen Rückgabetyp von Object hat.

1

Seit Prototyp ist die Superklasse von Fahrrad, wenn der super.clone() aufgerufen wird, wird ein geklontes Objekt zurückgegeben, das dann explizit in eine spezifischere Unterklasse von Prototype typecasted wird, die Bike ist.

Der Typguss wird benötigt, um den Anforderungen der Bike-Klasse gerecht zu werden. Eine allgemeinere Sicht ist, dass jedes Objekt die Object-Klasse als Super-Klasse hat, aber auch über benutzerdefinierte Methoden verfügt, die nicht in der Super-Klasse (Object-Klasse) definiert sind. Nachdem Sie es in die untergeordnete Klasse umgewandelt haben, können Sie auf die übergeordneten Methoden und die untergeordneten Methoden desselben Objekts zugreifen.

Verwandte Themen