3

为什么我可以使用我的自定义接口测试我的自定义类,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)。有什么不同?

4

1 回答 1

4

如果编译器可以检测到该instanceof操作永远不会为真,它将产生编译器错误。它通过遵循与铸造相同的规则来确定这一点。具体规则在 JLS 的第 15.20.2 节中描述:

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

于 2013-04-07T13:48:47.297 回答