4

そんなマップを実装したいのですが、

Map<Class<T>, T> m;

ここで、T のクラスが与えられると、T 型のジェネリック オブジェクトを取得できます。

あなたが言うかもしれないことを私は知っています、あなたはMap<String, Object>これをアーカイブするために a をラップしてキャストを使うことができます。

私はこれを知っている。

Map<Class<T>, Collection<T>>しかし、マップがであり、値が非常に大きなコレクションであると想像してください。

コレクションが大きすぎるため、コレクションをトラバースしてすべてのオブジェクトをキャストしたくありません。

そう?私は何をしますか?

4

3 に答える 3

4

Guavaにも似たようなものがあり、ClassToInstanceMapと呼ばれます。

詳細については、専用の Wiki セクションを参照してください。

しかし、どうやら必要なのはClassToInstanceMultimap. まだ何もありませんが、機能リクエストを提出できます。

于 2012-11-14T09:07:59.413 に答える
1

コレクションが大きすぎるため、コレクションをトラバースしてすべてのオブジェクトをキャストしたくありません。

私はそれについて心配しないだろう

  • これを行う必要はありません
  • ジェネリックはコンパイル時のチェックであるため、ジェネリックへのキャストは実行時に何もしません。

例: Ifを toT extends Objectにキャストしても何も起こりません。同様に、cast toは実行時に何もしません。ObjectTCollectionCollection<T>

しかし、マップが Map<Class<T>, Collection<T>> であり、値が非常に大きなコレクションであると想像してください。

これで何かができると思うなら、キャストは答えではありません。Collection の内容を変換する必要があるかもしれませんが、それは Java ではまったく異なります。

于 2012-11-14T09:12:21.877 に答える
0

Javaは型消去を使用するため、実装は実際には型消去を使用することに注意してください。

Map<?, ?> = Map<Object, Object>

目的の型安全性を提供する安全なアクセサーメソッドを簡単に記述できます。たとえば、次のinstanceOfチェックを行います。

public class InstanceMap extends HashMap<Class<?>, Object> {
    public <T> T getInstance(Class<T> cls) {
        Object o = super.get(cls);
        if (o != null && cls.isInstance(o)) {
            return (T) o;
        } else {
            return null;
        }
    }

    public <T> void putInstance(Class<T> cls, T value) {
        super.put(cls, value);
    }

    @Deprecated
    public Object get(Object key) {
        return super.get(key);
    }
}

それ自体が汎用の型を使い始めない限り、これは問題なく機能します。Class<? super T>その後、少し役立ちます。しかし、全体として、それはほとんどあなたに型安全性の誤った感覚を与えます。この種のマップは、あなたが慣れている強力な型安全性をあなたに与えません。結局、それはキャストに過ぎません。

私は以前にそのようなマップを使用しましたが、1〜2年間使用した後、最終的にはクリーンアップフェーズ中にコードからそれらを大幅に削除しました。それらはハックであり、私が期待したほど多くの利益を私に与えませんでした。

于 2012-11-14T09:18:23.390 に答える