[英]Test if object implements interface
之前可能已經提出過這個問題,但快速搜索只會提出與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;
}
instanceof
運算符以NullPointerException
安全方式執行工作。 例如:
if ("" instanceof java.io.Serializable) {
// it's true
}
收益真實。 以來:
if (null instanceof AnyType) {
// never reached
}
如果得到false,則instanceof
運算符為null安全(您發布的代碼不是)。
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
。
我更喜歡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。 使用此代碼,您只能獲得實現已定義接口的類型
那很簡單 :
interf.isInstance(object)
我今晚用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());
}
}
使用Apache commons-lang ArrayUtils,查看您需要的接口是否包含在對象的接口中
public static Boolean implementsInterface(Object object, Class interf){
return ArrayUtils.contains(object.getClass().getInterfaces(), interf);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.