java instanceof运算符不兼容的条件编译错误

时间:2016-08-11 10:40:55

标签: instanceof

有人可以解释一下。 当实例无法引用对象时,java instanceof运算符会给出编译器错误。细

让我提供一些示例代码

public class InstanceOfConfusing {

class A {}
class B1 extends A {}
class B2 extends A {}

public static void main(String... args) {

    InstanceOfConfusing ioc = new InstanceOfConfusing();

    A a = ioc.new A();
    B1 b1 = ioc.new B1();
    B2 b2 = ioc.new B2();

    boolean t1 = b1 instanceof A; // compiles, true
    boolean t2 = b1 instanceof B1; // compiles, true

    boolean t3 = b1 instanceof B2; // does not compile

    boolean t4 = a instanceof B1; // compiles, false ***

}

}

我理解除了标有***的最后一行以外的所有内容。我的问题很简单,为什么要编译? 如果编译在前一行上给出“不兼容的条件操作数类型”错误,因为类型B1的对象无法引用类型B2的实例,不应该 也知道B1没有办法引用A?

我不能这样写一行:b1 = new A(); 我会得到一个“类型不匹配”编译器错误,这是理所当然的。那么为什么编译器不知道b1这里没有办法引用类型A的实例?我误解了什么?

2 个答案:

答案 0 :(得分:0)

您可以使用向下转发进行分配。完成后,您可以了解a instanceof B1的用法以及为什么需要编译它。

B1 b = (B1) new A();

答案 1 :(得分:0)

我认为这是因为B1扩展了A,所以你可以这样做:

A a = new B1()

因此,使用a instanceof B1,您可以检查a是否是抽象类A的接口中包含的B1实例(例如)