次の一般的な境界を定義することは可能ですか?
- インターフェイスを実装します
SomeInterface
- あるクラスのスーパークラスです
MyClass
何かのようなもの:
Collection<? extends SomeInterface & super MyClass> c; // doesn't compile
specによると、答えは no になります (super
またはを使用できますがextends
、両方を使用することはできません):
タイプ引数: < TypeArgumentList > TypeArgumentList: 型引数 TypeArgumentList 、 TypeArgument タイプ引数: 参照タイプ ワイルドカード ワイルドカード: ? WildcardBoundsオプション ワイルドカード境界: ReferenceType を拡張します スーパー参照タイプ
変数を宣言するときに、ジェネリック型(T
あなたの場合)を境界とともに使用することはできません。
ワイルドカード ( ?
) にするか、クラスの完全なジェネリック型を使用する必要があります。
例えば
// Here only extends is allowed
class My< T extends SomeInterface >
{
// If using T, then no bounds are allowed
private Collection<T> var1;
private Collection< ? extends SomeInterface > var2;
// Cannot have extends and super on the same wildcard declaration
private Collection< ? super MyClass > var3;
// You can use T as a bound for wildcard
private Collection< ? super T > var4;
private Collection< ? extends T > var5;
}
場合によっては、クラス (またはメソッド) にジェネリック パラメーターを追加し、その特定のパラメーターに境界を追加することで、宣言を強化することができます。
class My <
T extends MyClass< I >,
I extends SomeInterface
>
{
}