Class オブジェクトが必要ですが、それが表すクラスがクラス A を拡張し、インターフェース B を実装するように強制したいと考えています。
できます:
Class<? extends ClassA>
または:
Class<? extends InterfaceB>
しかし、両方を行うことはできません。これを行う方法はありますか?
ベストアンサー1
実際には、好きなようにできます。複数のインターフェース、またはクラスとインターフェースを提供する場合は、ワイルドカードを次のようにする必要があります。
<T extends ClassA & InterfaceB>
を参照してくださいジェネリックチュートリアルsun.comでは、特に制限付き型パラメータセクションの下部にあります。 必要に応じて、& InterfaceName
必要なインターフェースごとに を使用して、複数のインターフェースをリストすることもできます。
これは非常に複雑になる可能性があります。例として、次のJavaDoc宣言をご覧ください。Collections#max
これは(2行に折り返して)次のようになります。
public static <T extends Object & Comparable<? super T>> T
max(Collection<? extends T> coll)
なぜそんなに複雑なのでしょうか? Java Generics FAQ に次のように書かれています:バイナリ互換性を保つため。
これは変数宣言には機能しないようですが、クラスにジェネリック境界を設定する場合には機能します。したがって、希望どおりの動作を行うには、いくつかのハードルを乗り越える必要があるかもしれません。しかし、それは可能です。クラスにジェネリック境界を設定して、次のようにすることができます。
class classB { }
interface interfaceC { }
public class MyClass<T extends classB & interfaceC> {
Class<T> variable;
}
必要な制限を持つものを入手してくださいvariable
。詳細と例については、3ページ目をご覧ください。Java 5.0 のジェネリックでは、クラス名が最初に来て、インターフェースがそれに続く必要があることに注意してください<T extends B & C>
。もちろん、リストできるクラスは 1 つだけです。