为什么我可以使用instanceof
针对我的自定义界面测试我的自定义类,而我无法对java核心类执行相同操作?
interface A{}
class B{}
public class Tmp {
public static void main(String [] args) {
String s = "";
Integer i = 1;
B b = new B();
System.out.println(s instanceof A); //1
System.out.println(i instanceof A); //2
System.out.println(b instanceof A); //3
}
}
第1行和第2行不会编译。第3行将编译(并打印false
)。有什么区别?
答案 0 :(得分:4)
如果编译器可以检测到instanceof
操作永远不会为true,则会生成编译器错误。它通过遵循与投射相同的规则来确定这一点。具体规则在JLS的Section 15.20.2中描述:
如果将RelationalExpression转换为ReferenceType 作为编译时错误被拒绝,然后是关系实例 表达式同样会产生编译时错误。在这样的 情况,表达式instanceof的结果永远不会 真。