instanceof如何在接口上工作

dev*_*per 45 java interface instanceof

instanceof可用于测试对象是否是给定类的直接或下降实例.instanceof即使接口无法像类一样实例化,也可以与接口一起使用.任何人都可以解释一下instanceof有效

sun*_*nil 54

首先,我们可以存储instances的实现特定的类interfaceinterface reference variable这样的.

package com.test;

public class Test implements Testeable {

    public static void main(String[] args) {

        Testeable testeable = new Test();

        // OR

        Test test = new Test();

        if (testeable instanceof Testeable)
            System.out.println("instanceof succeeded");
        if (test instanceof Testeable)
            System.out.println("instanceof succeeded");
    }
}

interface Testeable {

}
Run Code Online (Sandbox Code Playgroud)

即,任何实现特定接口的运行时实例都将通过instanceof测试

编辑

和输出

instanceof succeeded
instanceof succeeded
Run Code Online (Sandbox Code Playgroud)

@RohitJain

您可以使用像这样的匿名内部类来创建接口实例

Runnable runnable = new Runnable() {

    public void run() {
        System.out.println("inside run");
    }
};
Run Code Online (Sandbox Code Playgroud)

并且您使用这样的instanceof运算符测试实例是接口类型

System.out.println(runnable instanceof Runnable);
Run Code Online (Sandbox Code Playgroud)

结果是"真的"

  • @RohitJain请查看我的更新帖子以查询您的问题.对于接口的`instanceof`运算符总是会给`false`这是不正确的.请测试运行我的样本 (3认同)

Som*_*ame 17

object instanceof object_interface会屈服true.


Roh*_*ain 6

instanceof对a reference进行了instance检查,并检查该instance特定reference指向的类型.

现在既然你可以创建一个引用interface,它指向一个实现的实例class(相同的概念,Super class reference指向subclass instance).所以,你可以instanceof检查它.

例如: -

public interface MyInterface {
}

class ImplClass implements MyInterface {

    public static void main(String[] args) {
        MyInterface obj = new ImplClass();

        System.out.println(obj instanceof ImplClass);   // Will print true.
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 什么?当然`(obj instanceof ImplClass)== true`,obj class IS ImplClass!问题是,`(obj instanceof MyInterface)== true`?我想这是一个错字.这个解释有点令人困惑. (3认同)

Hoe*_*lzi 5

public class Programmers {\n\n    public static boolean hasReallife(Programmer programmer) {\n        return programmer instanceof Reallife; \xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x97\n    }                                                            \xe2\x95\x91\n                                                                 \xe2\x95\x91\n}                                                                \xe2\x95\x91\n                                                                 \xe2\x96\xbc\npublic class ReallifeProgrammer extends Programmer implements Reallife {\n\n    public ReallifeProgrammer() {\n        diseases.get("Obesity").heal();\n        diseases.get("Perfectionism").heal();\n        diseases.get("Agoraphobia").heal();\n    }\n\n    @Override\n    public void goOut() {\n        house.getPC().shutDown();\n        wife.argue();\n    }\n\n    @Override\n    public void doSports() {\n        goOut();\n        BigWideWorld.getGym("McFit").visit();\n    }\n\n    @Override\n    public void meetFriends() {\n        goOut();\n        BigWideWorld.searchFriend().meet();\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n