为什么在第一种情况下不能使用类型检查的变量作为第二种情况下的类型转换的变量?

时间:2020-04-07 14:51:06

标签: java class object casting type-conversion

class A
{
    boolean foo() {
        return true;
    }
}

为什么以下给出语法错误?
未为类型定义方法

if(a instanceOf A && a.foo()) {
.....
}

这很好-

if(a instanceOf A && ((A)a).foo()) {
.....
}

2 个答案:

答案 0 :(得分:1)

对于人类来说,很明显a的类型为A,因为进行了instanceof检查。编译器虽然不能那样工作,所以您仍然需要将a强制转换为A

答案 1 :(得分:1)

以前,instanceof operator仅返回truefalse,而对其操作数的类型没有影响。

As of Java 14, instanceof supports pattern matching(或查看规格预览here)。您可以声明一个新的内联变量,当且仅当检查成功时,该内联变量才是instanceof的目标类型。

例如,您的代码看起来像

if(a instanceof A actual && actual.foo()) {
    // ...
}