クラスとインターフェースを使用した Java ジェネリック - Together Ask Question

クラスとインターフェースを使用した Java ジェネリック - Together Ask Question

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 つだけです。

おすすめ記事