测试对象是否实现接口
问题描述:
这可能以前曾被问过,但是一个快速搜索只提出了同样的问题,询问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,你让我重新思考我的设计,所以我不再测试接口。
答
的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());
}
}
你就不能试着铸造和捕捉异常,如果一个人被抛出前(或检查如果Java有与C#“as”运算符类似的任何东西,那么甚至是空结果?)我是C#编程人员而不是Java编程人员,所以我主要是在这里猜测,尽管我会认为这种方法在任何OO语言中都是可能的。 – Noldorin 2009-04-19 21:21:45
耶!欢迎您:) – 2009-04-20 23:55:44
只有在您不必关心性能的情况下,抛出异常才是最佳实践。 – Rafa 2014-01-22 08:57:20