次の一般的な境界を定義することは可能ですか?
- インターフェイスを実装します
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
>
{
}