java instanceof compiletime错误发生的时间和原因?
下面给出的代码编译:
class Robot { }
interface Animal { }
class Feline implements Animal { }
public class BarnCat extends Feline {
public static void main(String[] args) {
Animal af = new Feline();
Feline ff = new Feline();
BarnCat b = new BarnCat();
Robot r = new Robot();
if(af instanceof Animal) System.out.print("1 ");
if(af instanceof BarnCat) System.out.print("2 ");
if(b instanceof Animal) System.out.print("3 ");
if(ff instanceof BarnCat) System.out.print("4 ");
if(r instanceof Animal) System.out.print("5 ");
}
}
这个会抛出编译时错误
public class One{
public static void main(String[] args) {
One o = new One();
if(o instanceof Two) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
}
class Two{}
为什么会这样?这两种情况在性质上很相似吗
# 1 楼答案
已知
o
的静态类型为One
。编译器知道One
对象不能是Two
对象(因为Two
是“另一个层次结构”)如果
Two
其中一个接口或一个类派生自One
,那么将成为可能# 2 楼答案
^{} 在运行时进行检查。然而,编译器可以在编译时判断这不是真的,这很聪明:)
见15.20.2. Type Comparison Operator instanceof:
# 3 楼答案
二班和一班没有任何关系。类1和类2之间不存在公共接口或继承关系。所以它会抛出一个异常
# 4 楼答案
对象
o
不可能是instanceof
类二。如果Two extends One
,则编译错误将被修复