测试对象是否实现接口

时间:2009-04-19 21:14:15

标签: java

之前可能已经提出过这个问题,但快速搜索只会提出与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,你让我重新考虑我的设计,所以我不再测试接口了。

7 个答案:

答案 0 :(得分:173)

instanceof运算符以NullPointerException安全的方式完成工作。例如:

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

产生真实。时间:

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

产生错误,instanceof运算符为空安全(您发布的代码不是)。

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

答案 1 :(得分:40)

这应该做:

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

例如,

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

评估为true

答案 2 :(得分:7)

我更喜欢instanceof

if (obj instanceof SomeType) { ... }

SomeType.isInstance(obj)

更常见,更易读

答案 3 :(得分:3)

这很简单:

   interf.isInstance(object)

答案 4 :(得分:3)

如果要测试接口:

public  List<myType> getElement(Class<?> clazz) {
    List<myType> els = new ArrayList<myType>();
    for (myType e: this.elements.values()){
        if (clazz.isAssignableFrom(e.getClass()) == true){
            els.add(e);
        }
    }
    return els;

}

clazz是一个接口,myType是您定义的可以实现许多接口的Tyoe。使用此代码,您只能获得实现已定义接口的类型

答案 5 :(得分:1)

今晚我用android遇到了这个问题,在查看了javadoc解决方案后,我想出了这个真正有用的解决方案,仅供像我这样需要比javadoc解释更多的人使用。

这是一个使用android java的实际界面的工作示例。 它检查调用实现AboutDialogListener接口的活动 在尝试转换AboutDialogListener字段之前。

public class About extends DialogFragment implements OnClickListener,
    OnCheckedChangeListener {

public static final String FIRST_RUN_ABOUT = "com.gosylvester.bestrides.firstrunabout";


public interface AboutDialogListener {
    void onFinishEditDialog(Boolean _Checked);
}

private AboutDialogListener adl;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    Activity a = this.getActivity();
    if (AboutDialogListener.class.isInstance(a)) {
        adl = (AboutDialogListener) a;
        }
}

... 稍后我在调用接口

之前检查字段adl是否为null
@Override
public void onStop() {
    super.onStop();
    sharedPref.edit().putBoolean(About.FIRST_RUN_ABOUT, _Checked).commit();
    // if there is an interface call it.
    if (adl != null) {
        adl.onFinishEditDialog(is_Checked());
    }
}

答案 6 :(得分:0)

使用Apache commons-lang ArrayUtils,查看您需要的接口是否包含在您对象的接口中

public static Boolean implementsInterface(Object object, Class interf){
    return ArrayUtils.contains(object.getClass().getInterfaces(), interf);
}