2011-09-15 6 views
0

私はIModelElementインタフェースとそのインタフェースを実装するいくつかのクラスを持っています。私のコードのどこかに次の文があります。与えられた型があるインタフェースを実装している場合の方法

Object childClass = request.getNewObjectType(); 

ここでgetNewObjectType()はClassオブジェクトを返します。そのClassオブジェクトがIModelElementインターフェイスを実装するクラスを表しているかどうかを確認する必要があります。

答えて

5

Class.isAssignableFrom()であり、クラスの場合request.getNewObjectType()はオブジェクトではなくクラスを返す必要があります。

if (IModelElement.isAssignableFrom((Class) childClass)) { 
    // whatever 
} 
+0

request.getNewObjectType()リターンが効果的に私が使用している要求インタフェースの実装では常にクラスインスタンスを返す(オブジェクトとしてのおかげでたくさん...私は、しかし、クラスとしてchildClassを宣言することはできません。私は考えます基本要求インタフェースは、その関数が、ジェネリックを使わずにクラスの戻り値の型と互換性があるようにオブジェクトを返すものとして宣言します。コメントありがとうございます、私が議論していることが意味をなさない場合は教えてください、私はJavaの完全な初心者です... – roirodriguez

+0

私はあなたのインターフェイス/ジェネリックの問題を理解しているか分からない。 'getNewObjectType()'が常にClassオブジェクトを返す場合、それがObjectを返す理由はありません。ジェネリックスなしでClassを他のものと同じように簡単に使用できます。 –

+0

Ok ...依然として後者の問題(依頼インターフェースの実装変更:依頼はObjectを返すファクトで、実際の実装では常にClassオブジェクトを返す)これらのインターフェースと実装はすべて外部APIからのものであり、すべてのファクトリ実装が常にClassオブジェクトを返すかどうかはわかりません... ifステートメントでのキャストは常に互換性がありますが、ClassとしてのchildClassの宣言は、Class以外のObjectを返すファクトリ実装と互換性がない可能性があります。 – roirodriguez

0

instanceofを使用していますか?

if(childClass instanceof Class) { 
    (Class) child = (Class) childClass; 
    child.method(); 
} 

http://download.oracle.com/javase/tutorial/java/nutsandbolts/op2.html

+1

問題は、childClassがClassインスタンスかどうかではなく、Classが既知のインタフェースを実装しているかどうかです。 –

0

試してみてください。

Object childClass = request.getNewObjectType(); 
if (childClass instanceof Class) { 
    for (Class interfaceClass in ((Class)childClass).getInterfaces()) { 
     if (interfaceClass.getCanonicalName().equals("org.xx.YourInterface")) { 
      // Do some stuff. 
     } 
    } 
} 
+1

私は 'in' =': 'と思っています。これは単純なことのための多大な作業です。インターフェイスを名前で参照することで、コンパイル時の型チェックを失うことはもちろんです。 –

1

あなただけIModelElementrequest.getNewObjectType()の戻り値をキャストしようとすることができます。 ClassCastExceptionが存在しない場合、返されるオブジェクトはインタフェースを実装するクラスになります。

try { 
    IModelElement temp = (IModelElement) request.getNewObjectType(); 
} catch (ClassCastException e) { 
    // the interface is not implemented 
} 
+0

これは機能しますが、代替手段がある場合は素晴らしい解決策ではありません。 CCEはNullPointerExceptionのような例外の1つで、ただキャッチしたくないものです。 –

+0

私はもっと美しい解決策があることに同意します。以前は '.isAssignableFrom(..)'について知らなかった。しかし、すべてのケースでCCEを捕まえるのは悪いと私は同感しません。 – fgysin

+0

CCEを捕まえるのに良い例を挙げることができますか? –

関連する問題