2017-10-12 83 views
-6

这怎么可能是合法的? A不是由Intf实现的。因此,如何才能合法使用?Java - interface -instsnceof

interface Intf { 
} 

class A{ 
} 

class B{} 

class Test {  
    public static void main(String[] args) { 
     A obj = new A(); 
     System.out.println(obj instanceof Intf); //Legal - no any errors, just output false 
     System.out.println(obj instanceof B); // Illegal - compile error 
    } 
} 
+0

你的问题是什么?合法使用这个作为什么? –

+1

你的印刷线声明的输出是什么?真正?假? “非法”? – deHaar

+0

实际上做的是,它检查你的对象到特定的类或接口, 那么合法的含义是什么? –

回答

1

JLS 15.20.2状态:

如果RelationalExpression到引用类型的铸造将被拒绝作为一个编译时间错误(§15.16),则的instanceof关系式同样产生一个编译时间错误。在这种情况下,表达式实例的结果永远不会是真的。

在这种情况下(Intf) obj不是编译时间错误,因为JLS 15.16状态:

如果操作数的编译时间类型不能通过铸造转换(§5.5)到由指定的目标类型被转换演员操作,然后发生编译时错误。

那么,为什么演员不是编译错误?

因为虽然obj的静态类型是A,但实际可能是AA的任何子类。而A的子类可能实现Intf !!

现在我们可以看到在这种情况下是不可能的,因为obj已经参考A实例进行初始化....但类型检查器不允许进行逻辑推理。 (或者至少如果是这样,它只能把它当作警告而不是错误。)

+0

哇。 Thatz完美的答案。谢谢 – kasun