2

内部でジェネリックを使用するコードがいくつかあります。パブリック API を介して機能が公開されるまでは、これまでのところすべて問題ありません。この問題は、次のおもちゃの例と同じです:特定のサブタイプ (この例では)Listのラップされたアイテムがあります。T extends Numberthis を返したいときにList、現在 を返しているためList<Wrapper<? extends Number>>、クライアント コードが非常に冗長になります。

戻り値の型を に変更する可能性はありList<Wrapper<Number>>ますか? クライアントは、Wrappers に特定のタイプの Number が含まれていることを知る必要はありません。キャストを使用していくつかのアプローチを試みましたが、すべてコンパイル エラーで失敗します。

public static List<Wrapper<? extends Number>> getNumbers() {
    Wrapper<Integer> number1 = new Wrapper<Integer>(1);
    Wrapper<Double> number2 = new Wrapper<Double>(2.);

    List<Wrapper<? extends Number>> numbers = new ArrayList<Wrapper<? extends Number>>();
    numbers.add(number1);
    numbers.add(number2);
    return numbers;
}

class Wrapper<T extends Number> {
    private final T item;
    Wrapper(T item) {
        this.item = item;
    }
    T getItem() {
        return item;
    }
}
4

3 に答える 3

2

Wrapperあなたがあなたのタイプについて示したことに基づいて、あなたのケースWrapper<? extends Number>まさにあなたが望むものです。なぜなら、あなたWrapper(それはプロデューサーです)からアイテムを取り出すことだけが可能であり、アイテムを入れることはできないからですgetItem()。 、Wrapper<? extends Number>それはあなたが望むものであるを返しますNumber。どのようにそれはあなたのニーズに合わないのですか?

「冗長」は、型安全性を捨てない正当な理由ではありません。

于 2012-09-09T09:14:39.990 に答える
0

次のアプローチが機能することがわかりました。潜在的な落とし穴に関するフィードバックやコメントは、引き続き非常に高く評価されます。

public static List<Wrapper<Number>> getNumbers() {
    Wrapper<Integer> number1 = new Wrapper<Integer>(1);
    Wrapper<Double> number2 = new Wrapper<Double>(2.);
    List<Wrapper<? extends Number>> numbers = new ArrayList<Wrapper<? extends Number>>();
    numbers.add(number1);
    numbers.add(number2);
    return (List<Wrapper<Number>>)(List<?>)numbers;
}
于 2012-09-09T07:30:18.080 に答える
0

私の知る限り、Tを返したい場合は不可能です.Tを返したいときにTのサブタイプを返すことはできません

于 2012-09-09T07:17:24.640 に答える