Поскольку Java не имеет наследования множественного класса, во время компиляции абсолютно известно, что объект obj
типа B
не может быть подтипом A
. С другой стороны, возможно, это может быть подтип интерфейса C
, например, в этом случае:
interface C {}
class B {}
class D extends B implements C {}
public class A {
public static void main(String args[]) {
B obj = new D();
System.out.println(obj instanceof C); //compiles and gives true as output
}
}
Так что, глядя только в obj instanceof C
, компилятор выражения не может заранее сказать, будет ли оно истинным или false, но, глядя на obj instanceof A
, он знает, что это всегда ложно, поэтому бессмысленно и помогает предотвратить ошибку. Если вы все еще хотите иметь эту бессмысленную проверку в своей программе, вы можете добавить явное литье к Object
:
System.out.println(((Object)obj) instanceof A); //compiles fine