测试对象是否实现接口

seb*_*ger 140 java

之前可能已经提出过这个问题,但快速搜索只会提出与C#相同的问题.看这里.

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

我有点想出了一个解决方案,但是在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;
}
Run Code Online (Sandbox Code Playgroud)


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

dfa*_*dfa 178

instanceof运营商确实在工作NullPointerException安全的方式.例如:

 if ("" instanceof java.io.Serializable) {
     // it's true
 }
Run Code Online (Sandbox Code Playgroud)

收益真实.以来:

 if (null instanceof AnyType) {
     // never reached
 }
Run Code Online (Sandbox Code Playgroud)

产生false,instanceof运算符是null安全的(你发布的代码不是).

instanceofClass#isInstance(Object)的内置编译时安全替代品

  • instanceof仅适用于类文字.因此它不能用于OP的情况 (5认同)
  • @NimChimpsky:你误解了我的观点.类文字是指在源代码中编写"MyClass.class"或"MyInterface.class"之类的东西.类文字可以引用类,接口和基元类型,并将返回Class类的相应实例.我的观点是OP不使用类文字,而是使用Class类的实例,不幸的是`instanceof`关键字的右侧操作符必须是类文字,而不是Class类的实例. (5认同)

Luk*_*ard 41

这应该做:

public static boolean implementsInterface(Object object, Class interf){
    return interf.isInstance(object);
}
Run Code Online (Sandbox Code Playgroud)

例如,

 java.io.Serializable.class.isInstance("a test string")
Run Code Online (Sandbox Code Playgroud)

评估为true.


Ste*_*Kuo 8

我更喜欢instanceof:

if (obj instanceof SomeType) { ... }
Run Code Online (Sandbox Code Playgroud)

这比它更常见和可读 SomeType.isInstance(obj)

  • 请记住,`if(obj instanceof SomeType){...}`是静态的(即 - 它不能在运行时更改)和`SomeType.isInstance(obj)`是动态的. (4认同)

And*_*son 5

那很简单 :

   interf.isInstance(object)
Run Code Online (Sandbox Code Playgroud)