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