このコードにはエラーがありますが、それを修正する方法がわかりません:
public class Point<T extends Number super Integer>{
}
Super は、名前付きの型パラメーターではなく、ワイルドカードでのみ有効です。
コンパイラがそれを許可したとしましょう。Number を拡張し、Integer のスーパータイプであると言える型は、Number と Integer の 2 つだけです。
int フィールドを持つ単純な非ジェネリック Point 型ではなく、これを行うことで得られる利点を理解するのに苦労しています。
実際のケースがより複雑で、Double、Integers などを使用できる一般的な Point が必要な場合は、Number 制限が間違いを回避するのに役立つ場合は、T extends Number を使用してください。
ただし、T が Number を拡張するだけでは、+、-、* などにアクセスすることはできません。そのための型クラス パターンが必要になる場合があります。これには、ジェネリック型が作成されたポイントから に渡される操作の別個の辞書が含まれます。数値演算が行われる場所。
例えば、
interface NumericOperations<T extends Number> {
T plus(T x, T y);
T subtract(T x, T y);
T multiply(T x, T y);
...
}
そのタイプ クラスのインスタンスを定義する必要があります。たとえば、 public static final NumericOperations intOperations = new NumericOper.....; です。
..これらのインスタンスを渡し、Point のメソッド内でプラス、マイナスなどを取得します。
public class Point<T extends Number>{
}
またはこれ
public class Point<T extends Integer>{
}
そんな使い方はできませんsuper
。ここを参照してください:Javaジェネリックスーパーキーワード
super
ワイルドカードを使用したキーワードのみを使用できます。
PECS の原則を確認する必要があります。プロバイダーは消費者スーパーを拡張します。
スーパー キーワードは、コンシューマー ジェネリック オブジェクトのジェネリック メソッドで使用されます。
例 :
public void copyList(List<? extends Number> elementsToBeCopied,
List<? super Integer> listToBeFilled) {...}
備考 : Integer
は final クラスであり、拡張できないため、extends
キーワードは適用できません。
この記事でsuper
は、 と の使用方法の良い例を示しますextends
。