首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >对于接口和类,“instanceof”运算符的行为不同

对于接口和类,“instanceof”运算符的行为不同
EN

Stack Overflow用户
提问于 2015-07-14 13:39:44
回答 2查看 4K关注 0票数 89

我想知道关于Java中instanceof操作符的如下行为。

代码语言:javascript
复制
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的情况下,它给出了编译器错误?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-14 13:49:50

因为Java没有多类继承,所以在编译过程中绝对知道B类型的obj对象不能是A的子类型。另一方面,它可能是接口C的子类型,例如在本例中:

代码语言:javascript
复制
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它知道这总是假的,因此没有意义,并帮助你防止错误。如果您仍然希望在程序中执行此无意义的检查,则可以向Object添加显式强制转换

代码语言:javascript
复制
System.out.println(((Object)obj) instanceof A);      //compiles fine
票数 129
EN

Stack Overflow用户

发布于 2017-11-19 00:26:41

通过在下面的类声明中使用final修饰符,可以保证不会有Test的子类,它可以实现接口Foobar。在这种情况下,很明显TestFoobar是不兼容的:

代码语言:javascript
复制
public final class Test {

    public static void main(String[] args) {
        Test test = new Test();
        System.out.println(test instanceof Foobar); // Compiler error: incompatible types
    }
}

interface Foobar {
}

否则,如果Test未声明为final,则可能由Test的子类实现该接口。这就是为什么编译器在这种情况下会允许语句test instanceof Foobar

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31398444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档