我的问题是,由于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();;
}
}
现在我已经编辑了我的帖子,所以这就是我真正想知道为什么会有这种差异。为什么编译没有失败,尽管它应该
答案 0 :(得分:5)
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,因此它永远不会是真的。