1. ホーム

[解決済み】クラスとインターフェイスを持つJavaジェネリック - Together

2022-03-24 06:23:18

質問

クラスオブジェクトが欲しいのですが、それが表すクラスがクラスAを拡張し、インターフェイスBを実装するように強制したいのです。

できるんです。

Class<? extends ClassA>

または

Class<? extends InterfaceB>

が、両方はできません。 何か方法はないでしょうか?

どのように解決するのですか?

実は、あなたは できること は好きなようにしてください。 複数のインターフェイスやクラスとインターフェイスを提供したい場合は、ワイルドカードを以下のようにする必要があります。

<T extends ClassA & InterfaceB>

をご覧ください。 ジェネリック・チュートリアル で、特に、sun.com の 境界型パラメータ のセクションをご覧ください。 実際には、複数のインターフェイスをリストアップすることができます。 & InterfaceName を、必要なものごとに指定します。

これは任意に複雑になる可能性があります。 デモンストレーションとして 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つだけしかリストアップできません。