测试对象是否实现接口

问题

之前可能已经提出过这个问题,但快速搜索只提出了同样的问题C#.See here.

我基本上想要做的是检查给定对象是否实现了给定的接口。

我有点想出一个解决方案,但是在if或case语句中经常使用它并不够舒服,我想知道Java没有内置解决方案。

public static Boolean implementsInterface(Object object, Class interf){
    for (Class c : object.getClass().getInterfaces()) {
        if (c.equals(interf)) {
            return true;
        }
    }
    return false;
}

编辑:好的,谢谢你的回答。特别是Damien Pollet和Noldorin,你让我重新考虑我的设计,所以我不再测试接口了。


#1 热门回答(167 赞)

Theinstanceofoperator以aNullPointerExceptionsafe方式完成工作。例如:

if ("" instanceof java.io.Serializable) {
     // it's true
 }

收益真实。以来:

if (null instanceof AnyType) {
     // never reached
 }

产生错误,theinstanceofoperator是null安全的(你发布的代码不是)。

instanceof是内置的编译时安全替代Class#isInstance(Object)


#2 热门回答(40 赞)

这应该做:

public static boolean implementsInterface(Object object, Class interf){
    return interf.isInstance(object);
}

例如,

java.io.Serializable.class.isInstance("a test string")

评估为true


#3 热门回答(7 赞)

我更喜欢instanceof

if (obj instanceof SomeType) { ... }

这比0332820991更常见和可读