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

时间:2017-03-06 10:17:25

标签: java instanceof

我的问题是,由于new Test()既不是String的子类,也不是字符串本身,那么为什么instanceof编译失败?不应该返回 false

    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();;
        }
    }

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

2 个答案:

答案 0 :(得分:5)

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

instanceof

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

Test课程的实例可以永远成为java.lang.String的实例。

  

<强> 15.20.2. Type Comparison Operator instanceof

     

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

答案 1 :(得分:0)

编译器知道String的类型层次结构是Object&gt; String,Test的层次结构是Object&gt; Test,因此它永远不会是真的。