2013-04-07 79 views
3

为什么我可以使用instanceof对我的自定义界面测试我的自定义类,并且我无法对java核心类执行相同操作?instanceof with custom/core classes

interface A{} 
class B{} 
public class Tmp { 
    public static void main(String [] args) { 
     String s = ""; 
     Integer i = 1; 
     B b = new B(); 
     System.out.println(s instanceof A); //1 
     System.out.println(i instanceof A); //2 
     System.out.println(b instanceof A); //3 
    } 
} 

第1行和第2行不会编译。第3行将编译(并打印false)。有什么不同?

+0

你读过[this](http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html)文章吗? – Bernard 2013-04-07 13:44:05

+0

@Bernard,是的,我读过这个。它没有回答我的问题。 – 2013-04-07 13:47:59

回答

4

如果编译器可以检测到instanceof操作永远不会成立,它将产生编译器错误。它通过遵循与铸造相同的规则来确定这一点。特定规则在JLS的Section 15.20.2描述:

如果RelationalExpression到引用类型的铸造将 拒绝作为一个编译时间错误,那么的instanceof关系 表达同样产生一个编译时间错误。在这样一个 的情况下,instanceof表达式的结果永远不可能是 。

+0

是的,我明白了!这是因为'String'和'Integer'都是final类,因此'String'或'Integer'引用的对象永远不能实现'A'。 'B'(或'HashMap')不是最终的,所以它们的子类可能会实现'A',所以编译器不能确定这种比较是没有意义的。 – 2013-04-07 13:53:39