2009-04-19 157 views
121

這可能以前曾被問過,但是一個快速搜索只提出了同樣的問題,詢問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; 
} 


編輯:好,感謝您的回答。特別是對達米安Pollet和Noldorin,你讓我重新思考我的設計,所以我不再測試接口。

+3

你就不能試着鑄造和捕捉異常,如果一個人被拋出前(或檢查如果Java有與C#「as」運算符類似的任何東西,那麼甚至是空結果?)我是C#編程人員而不是Java編程人員,所以我主要是在這裏猜測,儘管我會認爲這種方法在任何OO語言中都是可能的。 – Noldorin 2009-04-19 21:21:45

+0

耶!歡迎您:) – 2009-04-20 23:55:44

+0

只有在您不必關心性能的情況下,拋出異常纔是最佳實踐。 – Rafa 2014-01-22 08:57:20

回答

159

instanceof運營商確實在NullPointerException安全的方式工作。例如:

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

產生錯誤。因爲:

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

產生假的,instanceof經營者爲空安全(您發佈的代碼不)。

的instanceof是內置的,編譯時安全Class#isInstance(Object)

40

這應該這樣做:

public static boolean implementsInterface(Object object, Class interf){ 
    return interf.isInstance(object); 
} 

例如,

java.io.Serializable.class.isInstance("a test string") 

評估爲true

3

這很簡單:

interf.isInstance(object) 
7

替代我喜歡instanceof

if (obj instanceof SomeType) { ... } 

SomeType.isInstance(obj)

2

更爲常見和可讀性如果您想要測試接口:

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。有了這個代碼,你只能得到實現定義的接口

0

與Apache公地郎ArrayUtils的類型,看看你需要的界面包含在接口的你反對

public static Boolean implementsInterface(Object object, Class interf){ 
    return ArrayUtils.contains(object.getClass().getInterfaces(), interf); 
} 
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是!空調用接口

@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()); 
    } 
} 
相關問題