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