java - 'instanceof' 运算符对接口(interface)和类的行为不同

标签 java class inheritance interface instanceof

我想知道Java中 instanceof 运算符的以下行为。

interface C {}

class B {}

public class A {
    public static void main(String args[]) {
        B obj = new B();
        System.out.println(obj instanceof A);      //Gives compiler error
        System.out.println(obj instanceof C);      //Gives false as output
    }
}

为什么会这样? interface Cclass B 之间没有关系,但它给出 false 而在 obj instanceof A 的情况下它给出编译器错误?

最佳答案

因为Java没有多类继承,所以在编译过程中绝对知道B类型的obj对象不能是A的子类型。另一方面,它可能是接口(interface) 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表达式编译器无法提前判断它是真还是假,但是看obj instanceof A就知道这总是false,因此毫无意义,并帮助您防止错误。如果您仍然希望在程序中进行这种无意义的检查,可以向 Object 添加显式转换:

System.out.println(((Object)obj) instanceof A);      //compiles fine

关于java - 'instanceof' 运算符对接口(interface)和类的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31398444/

相关文章:

c++ - 头文件中模板类实现的模板成员

c++ - 如果我不释放/删除动态分配的数组会发生什么?

java - Java 中是否存在多重继承?

python - 棘手的模型继承 - Django

java - 如何用两个正则表达式 "_"和 "."剪切字符串

java - 从 Java 中检索 MYSQL 数据库结构信息

java - 货币格式问题

php - 拆分一个大的 PHP 类

python - 无法访问继承的 Python 类中的父属性

java - Hibernate注解连接问题