2013-07-05 34 views
1

我有一個將泛型類接口作爲參數的方法,我想檢查提供的接口是否擴展了某個基類,如果沒有,我會拋出異常。是否有可能做類似的事情:是否有可能評估類接口是否擴展某個基類?

public void genericMethod(Class<T> c) { 
    if (!(c instanceof baseClass)) { 
     throw new Exception("Must be instance of base class"); 
    } 
} 

即使有可能,它會被認爲是好的做法?或者,如果Java泛型遵循ducktyping的相同原則?

回答

5

您可以使用Class.isAssignableFrom

if (baseClass.isAssignableFrom(c)) { 
    ... 
} 

此代碼假定baseClassClass類型的變量(字段,局部變量,等等)。如果baseClass名稱(這將違背Java約定),則可以使用baseClass.class來代替,如Pshemo在註釋中所建議的。

從文檔:

判定此Class對象所表示的類或接口或者是相同,或是一個超類或超接口,由指定的Class參數所表示的類或接口。

+2

爲了更準確'baseClass.class.isAssignableFrom(C) '。無論如何+1 – Pshemo

+0

哦,我明白你的意思了。然而,沒有獨特的通用解決方案:如果'base'是一個'Class'(正如我最初假設的那樣,基於Java約定),則不能使用'.class'。如果它是一個類的*名稱*,那麼你必須使用'.class'。更確切地說,如果'baseClass'是一個類的名字,那麼我原來編寫的代碼甚至不會編譯;但是如果它是'Class'類型的變量,那麼你的代碼甚至不會編譯。 –

+0

由於OP使用'instanceof baseClass'我假設'baseClass'是接口的名稱而不是Class引用,但是所有東西都可以在SO questins :) – Pshemo

3

要解決您的問題的核心部分;而你要仿製藥的路徑,它會看起來更好,如果你只是有:

 public void genericMethod(Class<? extends BaseClass> c) { 
      // do what you want 
     } 

?通配符告訴編譯器,只有BaseClass子類是可以接受的爭論,本質上執行instanceOf檢查您。

這幾乎消除了在編譯時

又見你的方法被濫用的可能性

相關問題