1

このコードにはエラーがありますが、それを修正する方法がわかりません:

public class Point<T extends Number super Integer>{
}
4

3 に答える 3

1

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 のメソッド内でプラス、マイナスなどを取得します。

于 2012-09-28T13:45:32.667 に答える
1
public class Point<T extends Number>{
}

またはこれ

public class Point<T extends Integer>{
}

そんな使い方はできませんsuper。ここを参照してください:Javaジェネリックスーパーキーワード

于 2012-09-28T13:30:11.103 に答える
1

superワイルドカードを使用したキーワードのみを使用できます。

PECS の原則を確認する必要があります。プロバイダーは消費者スーパーを拡張します。

スーパー キーワードは、コンシューマー ジェネリック オブジェクトのジェネリック メソッドで使用されます。

例 :

public void copyList(List<? extends Number> elementsToBeCopied, 
    List<? super Integer> listToBeFilled) {...}

備考 : Integerは final クラスであり、拡張できないため、extendsキーワードは適用できません。

この記事でsuperは、 と の使用方法の良い例を示しますextends

于 2012-10-01T09:58:24.363 に答える