Java 测试对象是否实现了接口

Java 测试对象是否实现了接口,java,Java,以前可能有人问过这个问题,但快速搜索只会发现与C#相同的问题 我主要想做的是检查给定对象是否实现了给定接口 我找到了一种解决方案,但在if或case语句中频繁使用它还不够舒服,我想知道Java是否没有内置的解决方案 public static Boolean implementsInterface(Object object, Class interf){ for (Class c : object.getClass().getInterfaces()) { if (c.

以前可能有人问过这个问题,但快速搜索只会发现与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;
}

编辑:好的,谢谢你的回答。特别是对Damien Pollet和Noldorin来说,你让我重新思考我的设计,这样我就不再测试接口了。

这应该可以:

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

 java.io.Serializable.class.isInstance("a test string")
计算结果为
true

这很容易:

   interf.isInstance(object)
操作员以安全的方式进行工作。例如:

 if ("" instanceof java.io.Serializable) {
     // it's true
 }
结果是真的。自:

 if (null instanceof AnyType) {
     // never reached
 }
产生false,则
instanceof
运算符是空安全的(您发布的代码不是空安全的)


instanceof是内置的编译时安全的替代品,我更喜欢
instanceof

if (obj instanceof SomeType) { ... }

它比SomeType.isInstance(obj)

更常见、更易读,如果您想测试接口:

public List<myType> getElement(Class<?> clazz) {
    List<myType> els = new ArrayList<myType>();
    for (myType e: this.elements.values()) {
        if (clazz.isAssignableFrom(e.getClass())) {
            els.add(e);
        }
    }
    return els;
公共列表getElement(类clazz){
列表els=新的ArrayList();
对于(myType e:this.elements.values()){
if(clazz.isAssignableFrom(e.getClass())){
添加(e);
}
}
返回els;
}


clazz是一个接口,myType是您定义的一种类型,可以实现许多接口。通过这段代码,您只能获得使用Apache commons lang ArrayUtils实现定义接口的类型,请查看您所需的接口是否包含在对象的接口中

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

今晚我在android上遇到了这个问题,在看过javadoc解决方案之后,我为像我这样需要javadoc解释的人提出了一个真正可行的解决方案

下面是一个使用android java的实际接口的工作示例。 它检查调用实现AboutDialGlistener接口的活动 在试着投下一个近距离的闪光场之前

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());
    }
}

如果抛出异常,您就不能尝试强制转换并捕获异常吗(或者检查空结果,即使Java有任何与C#“as”操作符相关的内容)?我是一名C#编码器,而不是Java程序员,所以我在这里主要是猜测,尽管我认为这种方法在任何OO语言中都是可能的。在这种情况下抛出异常是一种很好的做法,前提是您不必关心性能。对不起,这些答案是什么让您重新思考您的设计的?即使删除了,它们是什么?你能帮帮我吗@sebastiangeiger@ozanmuyes很抱歉,我已经4年多没有编写Java了,不幸的是我记不起我做了什么。instanceof只对类文本有效。所以它不能用在OP的casesure中,它是编译时安全的;这是一种内在的方式,也是问题的论点(imho)@Lordofpigs不,它不是。它检查接口是否也实现了。@尼姆斯基:你误解了我的观点。类文本是指在源代码中编写
MyClass.Class
MyInterface.Class
之类的内容。类文本可以引用类、接口和基元类型,并将返回类的相应实例。我的观点是OP不是使用类文字,而是使用类的实例,不幸的是,
instanceof
关键字的右侧运算符必须是类文字,而不是类的实例。@dsd因为这篇文章我甚至没有听说/读过它,但在谷歌上查找后,我发现它是空指针异常的缩写。请记住
if(obj instanceof SomeType){…}
是静态的(也就是说,它在运行时无法更改),而
SomeType.isInstance(obj)
是动态的。