带接口的java中的instanceof运算符

时间:2017-08-10 09:24:27

标签: java polymorphism instanceof

任何人都可以使用instanceof运算符在Java中解释以下行为。

Runnable r = new Thread();

尽管变量r的类型是Runnable,并且对不在同一类层次结构中的类进行了比较实例

System.out.println(r instanceof String); // This line does not compile 

System.out.println(r instanceof Vector); // This line compiles

System.out.println(r instanceof FileNotFoundException); // This line compiles

3 个答案:

答案 0 :(得分:3)

final类是Runnable - 这意味着它不能被子类化。而且,它没有实现{{1}}。所有这些在编译时都是已知的;因此,编译错误。

答案 1 :(得分:1)

一个例子:

static class First {

}

static final class Second {

}

而不是:

    Runnable r = new Thread();

    System.out.println(r instanceof First);

    System.out.println(r instanceof Second);

编译器发现Secondfinal,因此它不能有sub-classes,因此无法实现Runnable

答案 2 :(得分:0)

String类是final,它没有实现Runnable接口。因此,r instanceof String永远不会返回true(因为不能有String的任何子类来实现Runnable),这就是编译器不允许的原因。

另一方面,可能存在实现Vector接口的FileNotFoundException类或Runnable类的子类,因此r instanceof Vector和{{1就编译器而言,可能会返回true。

这由JLS 15.20.2

涵盖
  

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