为什么在instanceof运算符上编译时间错误但在转换时工作正常

Jok*_*ker 2 java instanceof

我的问题是,既然 new Test()既不是子类,String也不是String本身那么instanceof编译失败的原因呢?它不应该返回虚假.

    public class Test{
        public static void main(String[] args) {
       //Compiles fails
       System.out.println(new Test() instanceof String);
      //compiles fine but run time class cast exception.   
        Test = (Test) new Object();;
        }
    }
Run Code Online (Sandbox Code Playgroud)

现在我已经编辑了我的帖子,所以这就是我真正想知道为什么会有这种差异.为什么编译没有失败,尽管它应该

Era*_*ran 5

instanceof 如果在编译时保证始终返回false,则无法应用.

规则是如果将第一个操作数转换为第二个操作数的类型将始终抛出ClassCastException,则编译器不允许instanceof在这些操作数上应用运算符.

你的Test类的一个实例永远不会是一个实例java.lang.String.

15.20.2.类型比较运算符instanceof

如果RelationalExpression对ReferenceType的强制转换(第15.16节)将作为编译时错误被拒绝,则关系表达式的实例同样会产生编译时错误.在这种情况下,instanceof表达式的结果永远不会成立.