2

私はEffectiveJavaを読んでいて、学んだことのいくつかを実行に移そうと決心しました。Multimap<?, Condition<?> > ワイルドカードがキーと値の両方で同じタイプになるが、異なる異なるタイプになる場所を効果的に作成しようとしています。

これが私が見ている本のアイテムです:アイテム29

私はそれを完全に複製しようとはしていません。大きな違いは、キーがリンクのように値を直接表していないことです。私の場合、キーは値の一般的なタイプを表します。

したがってmmap.put(Class<Integer>, ConditionMapping<Integer>) 、getを実行すると、ConditionMappingのジェネリック型がないため、チェックされていないキャスト警告が表示されます。

署名が必要なgetメソッドがあります<T> List<Condition <T> >(Class<T> type)

型消去のため、condition.valueが型Tであることを確認し、オブジェクトの新しいリストを作成する唯一のオプションはありますか?

チェックされていないキャスト警告を無視することもできますが、無視しようとしています。助言がありますか?チップ?トリック?

4

4 に答える 4

1

インターフェイスを拡張するMultimap<Void, Condition<?>>と、ユーザーはタイプセーフティに依存しないいくつかのメソッド(containsKeyなど)を呼び出すことができますが、チェックされていないキャストを使用しない限り、エントリを追加することはできません(タイプチェックされたプロキシメソッドをバイパスします)。

interface ConditionMapBase<T> extends Multimap<T, Condition<?>> {
}
interface ConditionMap extends ConditionMapBase<Void> {
    <T>boolean putCondition(T key, Condition<T> value);
    <T>Collection<Condition<T>> getConditions(T key);
}
class ConditionMapImpl
extends ForwardingMultimap<Void, Condition<?>>
implements ConditionMap {

    ConditionMapImpl() {
        delegate = HashMultimap.create();
    }
    @SuppressWarnings("unchecked")
    @Override
    protected Multimap<Void, Condition<?>> delegate() {
        return (Multimap<Void, Condition<?>>) (Multimap<?, ?>) delegate;
    }
    private final Multimap<Object, Condition<?>> delegate;
    @SuppressWarnings("unchecked")
    @Override
    public <T> Collection<Condition<T>> getConditions(T key) {
        return (Collection<Condition<T>>) (Collection<?>) ((ConditionMapBase<T>) this).get(key);
    }
    @SuppressWarnings("unchecked")
    @Override
    public <T> boolean putCondition(T key, Condition<T> value) {
        return ((ConditionMapBase<T>) this).put(key, value);
    }
}
于 2011-02-01T15:02:51.023 に答える
1

2つのワイルドカードが同じタイプをキャプチャする必要があることを表現する方法はありません。同様の状況と考えられる解決策の数については、この質問を参照してください。

于 2011-02-01T15:12:30.503 に答える
0

MyClassを作成し、それに独自のタイプを渡して、その中にMultimapをカプセル化することができます。Javaでのテンプレートの不可能性は、いわば別のレイヤーを追加し、本当に必要なものを中心にクラスをテンプレート化することで解決できることがよくあります。これは、「T」タイプをそのように取得して、リストまたはマップに使用できるためです。それ以降、複数のテンプレートで同じであることを保証します。

于 2010-11-16T14:12:47.727 に答える
0

これは正しい方向への一歩かもしれません。

<Multimap<Class<?>, Condition<?>>
于 2011-02-01T11:55:42.227 に答える