测试对象是否实现了接口

这个问题可能以前就有人问过,但是快速搜索只会引出针对 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;
}


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

161075 次浏览

这应该可以:

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操作员以 NullPointerException安全的方式完成工作,例如:

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

因为:

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

如果返回 false,则 instanceof操作符为 null safe (您发布的代码不为 null safe)。

Instanceof 类 # 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())) {
els.add(e);
}
}
return els;

}

Clazz 是一个 Interface,myType 是您定义的一个 Type,它可以实现许多接口。使用这段代码,您只能获得实现已定义接口的类型

使用 Apache commons-lang 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 是否为! 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());
}
}