测试对象是否实现接口

问题描述:

这可能以前曾被问过,但是一个快速搜索只提出了同样的问题,询问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; 
} 


编辑:好,感谢您的回答。特别是对达米安Pollet和Noldorin,你让我重新思考我的设计,所以我不再测试接口。

+3

你就不能试着铸造和捕捉异常,如果一个人被抛出前(或检查如果Java有与C#“as”运算符类似的任何东西,那么甚至是空结果?)我是C#编程人员而不是Java编程人员,所以我主要是在这里猜测,尽管我会认为这种方法在任何OO语言中都是可能的。 – Noldorin 2009-04-19 21:21:45

+0

耶!欢迎您:) – 2009-04-20 23:55:44

+0

只有在您不必关心性能的情况下,抛出异常才是最佳实践。 – Rafa 2014-01-22 08:57:20

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

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

产生错误。因为:

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

产生假的,instanceof经营者为空安全(您发布的代码不)。

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

这应该这样做:

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

例如,

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

评估为true

这很简单:

interf.isInstance(object) 

替代我喜欢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()) == true){ 
      els.add(e); 
     } 
    } 
    return els; 

}

clazz是一个接口,myType是您定义的可以实现多个接口的Tyoe。有了这个代码,你只能得到实现定义的接口

与Apache公地郎ArrayUtils的类型,看看你需要的界面包含在接口的你反对

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

今晚我有这个问题使用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是!空调用接口

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