2009-04-19 14 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; 
} 


EDIT:[OK]を、あなたの答えに感謝。特にDamien PolletとNoldorinには、私のデザインを再考させて、もうインターフェースをテストしないようにしました。

+3

を呼び出す前に!nullであるかどうかを確認(またはをチェックJavaがC#as "演算子に類似したものを持っていれば、結果はnullです)?私はJavaのコードではなくC#のコーダーなので、主にここで推測していますが、どのようなオブジェクト指向言語でもこのようなアプローチが可能だと思います。 – Noldorin

+0

yay!あなたは歓迎です:) –

+0

このケースでは、投球の例外は、あなたがパフォーマンスを気にする必要がない場合にのみ有効です。 – Rafa

答えて

159

instanceofオペレータがNullPointerException安全な方法で作業を行います。たとえば、

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

が成立します。以来:

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

が偽もたらし、instanceofオペレータがnull安全(あなたが投稿したコードではない)です。 instanceofは

は私がinstanceof好むClass#isInstance(Object)

+4

instanceofはクラスリテラルでしか動作しません。したがって、OPのケースでは使用できません – LordOfThePigs

+0

確かに、それはコンパイル時に安全です;それは組み込みの方法であり、質問(イホ)の議論です – dfa

+0

@LordOfThePigsいいえ。インタフェースが実装されているかどうかをチェックします。 – NimChimpsky

40

これは、実行する必要があります。たとえば

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

を、

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

trueに評価されます。

簡単だった
+1

+1これはオブジェクトがnullの場合には失敗しません – msangel

3

interf.isInstance(object) 
7

に内蔵され、コンパイル時に安全な代替手段です:

if (obj instanceof SomeType) { ... } 

はるかに一般的で読みやすいSomeType.isInstance(obj)

+3

'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です。必要なインタフェースはインタフェースに含まれている場合は、このコードを使用するには、Apacheコモンズ・ラングのArrayUtilsで定義されたインタフェース

0

を実装するだけのタイプを取得し、あなたは私がこの問題今夜を持っていた

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は、あなただけのキャストを試してみて、1がスローされた場合、例外をキャッチすることはできませんインターフェース

@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()); 
    } 
} 
関連する問題