任何人都可以使用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
答案 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);
编译器发现Second
为final
,因此它不能有sub-classes
,因此无法实现Runnable
。
答案 2 :(得分:0)
String
类是final
,它没有实现Runnable
接口。因此,r instanceof String
永远不会返回true(因为不能有String
的任何子类来实现Runnable
),这就是编译器不允许的原因。
另一方面,可能存在实现Vector
接口的FileNotFoundException
类或Runnable
类的子类,因此r instanceof Vector
和{{1就编译器而言,可能会返回true。
如果RelationalExpression对ReferenceType的强制转换(第15.16节)将作为编译时错误被拒绝,则关系表达式的实例同样会产生编译时错误。 在这种情况下,instanceof表达式的结果永远不会是真的。