2015-06-24 45 views
1

考慮以下層次:爲什麼需要多種類型鑄造?

TopClass 
     |__ MiddleClass 
        |__ BottomClass 

然後將下面的代碼是 - 當然不是必需的:

public BottomClass getBottom() { 
    return (BottomClass) (MiddleClass) getObject(); 
} 

getObject()返回BottomClass類型的實例,但有TopClass返回類型。

你可以有效地短路它,並直接投射到BottomClass


但這個代碼提出了我的眉頭:

在JavaFX的源碼包, 類:com.sun.javafx.scene.control.skin.ProgressIndicatorSkin

@Override 
public StyleableProperty<Paint> getStyleableProperty(ProgressIndicator n) { 
    final ProgressIndicatorSkin skin = (ProgressIndicatorSkin) n.getSkin(); 
     return (StyleableProperty<Paint>)(WritableValue<Paint>)skin.progressColor; 
} 

凡界面層次是:

WritableValue<T> 
       |__ StyleableProperty<T> 

而且progressColor是的類型210,實現StyleableProperty<Paint>,而是存儲在ObjectProperty<Paint>變量,像這樣:

private ObjectProperty<Paint> progressColor = new StyleableObjectProperty<Paint>(null) 

任何線索這是怎麼回事呢?

+1

您是否嘗試刪除中間演員?它有錯誤嗎?錯誤說了什麼? – ReyCharles

+0

它似乎只是一些不必要的代碼,但我對JavaFX不太瞭解,不知道是否有某種看不見的原因。 –

+0

這不是我的代碼,它是JDK的一部分。而且可能不需要JavaFX的知識。 – Mordechai

回答

1

中介演員似乎沒有必要。直接投中應該工作。

但是,直接投射將是兩種類型之間沒有明顯的子類型關係的「交叉」投射。

程序員可能不希望這樣;相反,程序員更傾向於接近最常見的超類型,然後做一個低調的,感覺更「安全」的。


強制轉換的討論:

它總是安全的這樣一個「向上」劇組

(Animal)cat 

它允許做一個「下」劇組;編譯器假定程序員知道更好的實際運行時類型

(Cat)animal 

這是「交叉」強制轉換是一個問題。有時很明顯,交叉轉換是不可能的

(Cat)dog // Cat and Dog are two classes, and no subclass relation 

    (List<Cat>) listDog // List<Dog> => List<Cat> 

    (Runnable)fish // Fish is a final class that does not implement Runnable 

但是,如果它不可證明不正確,編譯器會允許它,相信程序員

 (Runnable)animal // Animal class does not implement Runnable; but a subclass may 

我們總是可以投之間某兩種通過一個共同的超

 (List<Cat>)(List<?>) listDog 

當然會,對象是所有類型的公用超類型,所以我們可以使用它來強制任何演員表

 (Cat)(Object)dog 
+0

哇!從來不知道_that_。但在我的情況下,'StyleableObjectProperty'直接實現'StyleableProperty'? – Mordechai

+0

@MouseEvent - skin.progressColor的靜態類型是ObjectProperty – ZhongYu

+0

超級,我現在注意到'ObjectProperty'實現'WritableValue'。 – Mordechai