gpt4 book ai didi

java - 为什么需要多重类型转换?

转载 作者:行者123 更新时间:2023-11-30 08:06:25 25 4
gpt4 key购买 nike

考虑以下层次结构:

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类型为StyleableObjectProperty<Paint> ,实现 StyleableProperty<Paint> ,但存储在 ObjectProperty<Paint> 中变量,如下所示:

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

知道这里发生了什么吗?

最佳答案

中间 Actor 似乎没有必要。直接转换应该可以。

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

程序员可能不希望这样;相反,对于程序员来说,向上转换为最接近的常见父类(super class)型,然后进行向下转换会更舒服,这感觉“更安全”。

<小时/>

Actor 阵容讨论:

进行“向上”转换总是安全的

    (Animal)cat

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

    (Cat)animal

“交叉” Actor 阵容是一个问题。有时很明显跨播是不可能的

    (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

我们始终可以通过公共(public)父类(super class)型在任意两种类型之间进行转换

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

当然,Object 是所有类型的公共(public)父类(super class)型,因此我们可以使用它来强制进行任何强制转换

     (Cat)(Object)dog

关于java - 为什么需要多重类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31032592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com