2016-07-05 12 views
0

引数の1つが特定のクラス(MyClass)に由来し、インターフェイス(MyInterface)を実装するメソッドを作成しています。これを行うためのメソッドの引数が1つのクラスから継承し、インターフェイスを実装することを指定します。

粗製の方法はMyClassMyInterfaceを実装していない、との両方が、私は彼らがそうであるようにインポートするクラスであることを

public void doStuff(MyClass arg0) { 
    if (!(arg0 instanceof MyInterface)) 
     throw new IllegalArgumentException("arg0 must implement MyInterface"); 
    // do whatever we need to do 
} 

注だろう。

これを行うより洗練された方法があります。できれば、ビルド時にすでにエラーが発生している可能性がありますか?

あなたは、次の一般的な方法でそれを行うことができます
+1

「public void doStuff(MyInterface someclass)」はどうなっていますか? MyClassにMyInterfaceを実装させるだけですか? –

+0

@blahfunkどちらのクラスも単なるインポートなので、オプションではありません。私はその質問を明確にした。 – user149408

答えて

5

public <T extends MyClass & MyInterface> void doStuff(T arg) { ... } 

次のクラス(およびインタフェース)を想定すると

class MyClass {} 
interface MyInterface {} 

class A extends MyClass {} 
class B implements MyInterface {} 
class C extends MyClass implements MyInterface {} 

次の2つのステートメントは、違法な(コンパイルエラー)です

doStuff(new A()); 
doStuff(new B()); 

次の文はコンパイルされますが、

doStuff(new C()); 

somehwat奇妙な型の変数宣言の詳細は、JLS §4.4 (Type Variables)を参照してください。

+0

コード構造によっては、単にvoid doStuff(C arg)を実行することができます。 – 4castle

+1

他のクラスもそのクラスを拡張してそのインターフェイスを実装しても動作しません。 – Seelenvirtuose

+0

さて、これらの他のクラスを 'extend C'にすることはできますが、それはOPにとって不可能かもしれません。なぜそれが"コード構造に依存するのですか " – 4castle

関連する問題