2017-04-04 75 views
2

編輯:我遇到這個問題,當我需要克隆一個對象,我已經搜索,但沒有問題解決我的問題。Java:類型轉換克隆之前?

當我在Java中學習原型模式時,我跟隨了一些教程,並對(Bike)super.clone()的類型轉換感到困惑。

首先完成哪項工作? (Bike)supersuper.clone()?爲什麼需要(Bike)

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

[Java cast order]的可能重複(http://stackoverflow.com/questions/5762270/java-鑄造順序) – Tom

回答

2

鑄造具有較低的優先級比函數調用:

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

在你的情況,因爲你調用super.clone(),這是從Object.clone()繼承的,它返回一個Object

+0

我給你投票,因爲我在'(Foo)'和'a'之間找到了一個空格,這有助於我記住這一點。 – user7813604

2

super.clone()執行第一,那麼結果是使用投(Bike)(鑄件被施加到下面的表達式的結果)。

您需要投票,因爲您正在重寫Object#clone(),這可以追溯到仿製前的JDK1.0,並且返回類型爲Object

1

由於劇組是必要的Prototype是自行車的超級類,當super.clone()被調用時,返回一個克隆對象,然後被明確地轉換成一個更具體的Prototype子類,即Bike。

類型鑄造需要適應自行車類的要求。 更普遍的觀點是每個創建的對象都有Object類作爲它的超類,但也有用戶定義的方法,它們沒有被定義在超類(Object類)中。將類型轉換爲子類後,可以從同一對象訪問父方法和子方法