4

(i)および (ii)によってインデックス付けされた2 つMultimapの のと、 のリストを出力するルーチンがあります。StringIntegerDoubleString

public static void outputInteger(Multimap<Integer, String> map) {
    for (Integer key : map.keySet()) {
        Collection<String> strings = map.get(key);
        output(strings);
    }
}

public static void outputDouble(Multimap<Double, String> map) {
    for (Double key : map.keySet()) {
        Collection<String> strings = map.get(key);
        output(strings);
    }
}

Numberのスーパークラスとして使用して、これらを 1 つのルーチンに結合したいと思います。IntegerDouble

public static void outputNumber(Multimap<? extends Number, String> map) {
    for (Number key : map.keySet()) {
        Collection<String> ids = map.get(key); //** 
    }
}

ただし、アスタリスクの行はコンパイルされません

The method get(capture#5-of ? extends Number) in the type 
Multimap<capture#5-of ? extends Number,String> is not 
applicable for the arguments (Number)

どうすればこれに対処できますか?

4

4 に答える 4

9

宣言

Multimap<? extends Number, String> map;

map がNumber の未知の特定のサブタイプ (含む) であるキー タイプを持っていることを示します。言い換えれば、コンパイラはそれがMultimap<Integer, String>、 またはMultimap<Short, String>、 またはMultimap<Number, String>などである可能性があると考えます。このため、 を呼び出すことはできません。map.get(Number)コンパイラが知る限り、Multimap<Double, String>.

これができない理由は、 でより明白になりputます。でできるはずですput(Number, String)map?いいえ、それがたまたま だった場合、マップの整合性に違反するキーをMultimap<Integer, String>追加する可能性があるためです。Double

通常のMap<K, V>インターフェースでは、 ではなくgetとして定義されているため、これは問題ではget(Object)ありませんget(K)

ポールの答えには、この状況に対する優れた回避策があります。基本的に、彼は中間ジェネリック メソッドを使用して、不明な型 (この場合は で表されるcapture#5-of ? extends Number) に名前 (型パラメーターT) を付けています。これにより、2 つの異なるコンテキストで発生するキャプチャを関連付けて、これらのコンテキスト全体で何かを実行できるようになります。

于 2013-04-16T16:26:19.297 に答える
7

ジェネリック メソッドを使用して、目的を達成できるはずです。

public static <T extends Number> void outputNumber(Multimap<T, String> map) {
    for (T key : map.keySet()) {
        Collection<String> strings = map.get(key);
        output(strings);
    }
}

ワイルドカードで機能しない理由は、または extends である未知の型? extends Numberを意味するためです。一方、他の互換性のない型を参照する可能性があります(コンパイラが知っているすべての場合)。NumberNumber key

于 2013-04-16T16:24:16.083 に答える
7
public static void output(Multimap<? extends Number, String> map) {
    for (Collection<String> strings : map.asMap().values()) {
        output(strings);
    }
}
于 2013-04-16T16:28:19.600 に答える
0

問題は、ジェネリック引数を渡さずに宣言することです。

このタイプの実装がある場合、エラーは発生しません

public static <T extends Number> void outputNumber(Multimap<T, String> map) {

        for (T key : map.keySet()) {
            map.get(key);
        }
    }
于 2013-04-16T16:28:12.743 に答える