带有自定义/核心类的instanceof

时间:2013-04-07 13:41:45

标签: java instanceof

为什么我可以使用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)。有什么区别?

1 个答案:

答案 0 :(得分:4)

如果编译器可以检测到instanceof操作永远不会为true,则会生成编译器错误。它通过遵循与投射相同的规则来确定这一点。具体规则在JLS的Section 15.20.2中描述:

  

如果将RelationalExpression转换为ReferenceType   作为编译时错误被拒绝,然后是关系实例   表达式同样会产生编译时错误。在这样的   情况,表达式instanceof的结果永远不会   真。