引数

2017-04-20 6 views
1

として、私がすべきは、のようなものClass<A>を受ける方法があります:私はそれが動作を行うmethod(A.class)のように呼び出すしようとすると、その後引数

protected void method(final Class<A> clazz) { 
} 

を、私はBがあるmethod(B.class)を、しようとした場合を子供のA、私はメッセージ "互換性のない種類"を取得します。

解決策はClass<B>に変更されていますが、C.classのように、このmethod()に引数として渡したい別の子があります。

+3

関連:[リストはリストのサブクラスですか?なぜJavaのジェネリックは暗黙的に多相ではないのですか?](http://stackoverflow.com/q/2745265) – Pshemo

答えて

5

一つの解決策は、パラメータを定義する際に有界ワイルドカードを使用することです。これにより

protected void method(final Class<? extends A> clazz) { 
    // Code here... 
} 

、あなたはAの直接クラスやAから延びている任意のクラスを渡すことが許可されています。

protected <T extends A> void method(final Class<T> clazz) { 
    // Code here... 
} 

どちらも動作しますが、それはあなたがそう、我々は他の上で1つを選択することができますclazzで行う予定かを知るために役立つだろう:

それともパブロとして

が示唆されました。

+4

'protected voidメソッド(finalクラス clazz)を使用することをお勧めします。 'clazz'メソッドを呼び出すときにワイルドカードの混乱を避けることができます。 –

+0

@ PavloViazovskyyどのジェネリック医薬品はあなたを参照していますか? 'Class 'で呼び出すことができるのはすべてプロデューサメソッドです。それは単純に(例えば) 'A instance = clazz.getInstance();'です。 –

+0

@AndyTurner。はい、あなたが正しい。それは私の間違いです。 'Class'は消費者メソッド(' T'をパラメータとする)を持っていないので、_Jacob_が最初に提案したメソッドのワイルドカード版を使うだけで十分です。 –