【发布时间】:2013-10-01 12:34:33
【问题描述】:
我认为下面的代码会编译并打印“否”
class One{
public static void main(String[] args) {
One o = new One();
if(o instanceof Two) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
}
class Two { }
但它给我一个编译器错误,说明inconvertible types
instanceof 运算符不应该检查对象是否在继承层次结构中,如果是则返回 true,如果不是则返回 false
编辑:
如果编译器已经知道某个条件永远不会为真并且它会引发编译器错误,那么为什么要编译这段代码
if(false) {
System.out.println("Yes");
}
【问题讨论】:
-
因为它可以从类名中看出答案是否定的。将 o 声明为 Object(但仍创建 One)。
Object o = new One(); -
@fvrgl :我没看到那个帖子,我的错。但你能看到我的编辑并提供解释吗?
-
你在 if(false) 案例中没有违反任何规则。
-
JLS 声明:如果将 RelationalExpression 转换为 ReferenceType 将作为编译时错误被拒绝,那么 instanceof 关系表达式同样会产生编译时错误。在这种情况下,instanceof 表达式的结果永远不会为真。
-
JLS 非常明确且切中要害。
标签: java