【问题标题】:what does the word "to promise" mean in the context of casting, compiler?在铸造,编译器的上下文中,“承诺”一词是什么意思?
【发布时间】:2019-02-23 11:43:12
【问题描述】:

来自java书籍:

当您将值存储在变量中时,编译器会检查您是否承诺太多。如果您将子类引用分配给超类变量,那么您的promising 就会减少,编译器只会让您这样做。如果您将超类引用分配给子类变量,则您有希望更多。然后您必须使用 cast 以便您的 promise 可以在运行时检查。

如果您能向我解释在技术问题上“承诺”是什么意思,我会理解的。我查了字典,但这个词不适合本段的上下文。

【问题讨论】:

    标签: java casting compilation terminology


    【解决方案1】:

    这不是标准术语,但作者似乎正在使用它来(尝试)让初学者可以使用它。 (这并不容易。)基本上,他们是说如果你有:

    class Base {
        public void baseMethod() {
            // ...
        }
    }
    class Derived extends Base {
        public void derivedMethod() {
            // ...
        }
    }
    

    你可以这样做:

    Base b = new Derived();
    

    ...因为 Base 类型定义的所有功能 (baseMethod) 在您分配的对象(Derived 的实例)上都可用。您“承诺”b 所指的对象将具有baseMethod,并且确实如此。

    但你不能这样做:

    Derived d = new Base();
    

    ...因为Derived 类型定义了您分配的对象(Base 实例)没有的特性(derivedMethod)。您“承诺”d 所指的对象将具有 derivedMethod,但事实并非如此,因此您“承诺太多”。


    你的评论:

    第二个例子中的转换是怎么来的?

    它没有进入那个例子。强制转换不会改变对象是什么,只会改变你对它的引用。¹

    但是假设你有这样的事情:

    void someMethod(Base obj) {
        if (obj instanceof Derived) { // Just an example, `instanceof` is usually
                                      // an anti-pattern
            Derived d = (Derived)obj;
            // ...
        }
    }
    

    该方法接收一个对象并且只有一个Base 对它的引用。但是随后代码检查并发现该对象实际上是Derived(或Derived 的子类),因此它使用强制转换来更改它所拥有的引用类型,以便它可以使用Derived 功能。所以选角就是以这种方式出现的。

    再次注意,在十分之九的情况下,使用instanceof 是一种反模式。十分之九,您希望重构代码,以便将接口类型传递给仅定义代码所需功能的代码。第十种情况很少见。 :-)

    第二次的施法总是成功吗?

    只有当您确定该对象属于您要转换的类型或该类型的子类时。如果您不确定,投射它可能会抛出 ClassCastException


    ¹ ...除了将基元(例如int)转换为它们的包装对象(例如Integer)的特殊情况,反之亦然。即使这样,它也不会更改对象,它只是创建一个对象(当转换为包装器类型时)或创建一个基元(当转换为基元类型时)。

    【讨论】:

    • “很有希望”。好的,第二个例子中的铸造是如何出现的?并且第二次的选角总是成功的吗?
    • @hamzabelmellouki - 我已经编辑了答案以回答该评论的问题。
    猜你喜欢
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 2011-10-22
    • 2013-10-14
    相关资源
    最近更新 更多