2015-06-24 47 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