簡體   English   中英

測試對象是否實現接口

[英]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;
}


編輯:好的,謝謝你的回答。 特別是Damien Pollet和Noldorin,你讓我重新考慮我的設計,所以我不再測試接口了。

instanceof運算符以NullPointerException安全方式執行工作。 例如:

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

收益真實。 以來:

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

如果得到false,則instanceof運算符為null安全(您發布的代碼不是)。

instanceofClass#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM