Classオブジェクトが必要ですが、それが表すクラスを強制的にクラスAに拡張し、インターフェースBを実装したいと思います。
できます:
Class<? extends ClassA>
または:
Class<? extends InterfaceB>
しかし、私は両方を行うことはできません。これを行う方法はありますか?
Classオブジェクトが必要ですが、それが表すクラスを強制的にクラスAに拡張し、インターフェースBを実装したいと思います。
できます:
Class<? extends ClassA>
または:
Class<? extends InterfaceB>
しかし、私は両方を行うことはできません。これを行う方法はありますか?
回答:
実際に、あなたはあなたがやりたいことをすることができます。複数のインターフェースまたはクラスとインターフェースを提供する場合は、ワイルドカードを次のようにする必要があります。
<T extends ClassA & InterfaceB>
sun.com のGenerics Tutorial、特にページの下部にあるBounded Type Parametersセクションを参照してください。必要に応じて、実際に複数のインターフェースをリストすることができ& 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
にはあなたが望む制限があります。詳細と例については、Generics in Java 5.0の 3ページをご覧ください。<T extends B & C>
では、クラス名が最初に来る必要があり、インターフェイスが後に続くことに注意してください。もちろん、リストできるクラスは1つだけです。
?
その表現には何もないので、それは本当に「ワイルドカード」なのでしょうか?型パラメーターが本当にワイルドカードである場合、「一度に2つのものを拡張する」という概念全体を機能させることができないので、質問します。
「匿名」型パラメーター(つまり、を使用するワイルドカード)を使用?
してそれを行うことはできませんが、「名前付き」型パラメーターを使用して行うことはできます。メソッドまたはクラスレベルで型パラメーターを宣言するだけです。
import java.util.List;
interface A{}
interface B{}
public class Test<E extends B & A, T extends List<E>> {
T t;
}