Java 为什么需要多类型铸造?

Java 为什么需要多类型铸造?,java,casting,Java,Casting,考虑以下层次结构: TopClass |__ MiddleClass |__ BottomClass 那么以下代码当然不是必需的: public BottomClass getBottom() { return (BottomClass) (MiddleClass) getObject(); } 其中getObject()返回类型为BottomClass的实例,但返回类型为TopClass 您可以有效地将其短路,并直接转换到Botto

考虑以下层次结构:

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;
}

有什么线索吗?

中间演员似乎没有必要。直接演员应该是有效的

然而,直接类型转换是两种类型之间的“交叉”类型转换,没有明显的子类型关系

程序员可能不希望这样;相反,程序员更愿意向上转换到最近的通用超类型,然后再向下转换,这感觉“更安全”


关于铸件的讨论:

“向上”投总是安全的

允许进行“向下”投射;编译器假定程序员更了解实际的运行时类型

    (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
我们总是可以通过一个公共超类型在任意两个类型之间进行强制转换

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

你试过移除中间铸件吗?它有错误吗?错误是怎么说的?这似乎只是不必要的代码,但我对JavaFX还不够熟悉,不知道是否有一些看不见的原因。这不是我的代码,它是JDK的一部分。而且可能不需要JavaFX.Wow方面的知识!我从来不知道。但是在我的例子中,
StyleableObjectProperty
确实直接实现了
StyleableProperty
?@MouseEvent-skin.progressColor的静态类型是
ObjectProperty
Super,我现在注意到
ObjectProperty
实现了
writeablevalue
    (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