7

混合型にマップする HashMap を作成する方法を探しています。

たとえば、次は Python で機能します (Pythondictは Java に似ていることに注意してくださいHashMap)。

d = dict()
d["str"] = "This is a string"
d["flt"] = 1.23
d["int"] = 5

にアクセスするd[x]と、適切な型 (この例では string、float、int) が返されます。

Java では、 を使用できますが、HashMap<String, Object>各オブジェクトがどのタイプであるかをすぐに判断する方法は実際にはありません。

代わりに、私は現在MixedType、オブジェクトを保持するクラスを作成するだけでなく、元の型情報も作成して、後でダウンキャストできるようにしようとしています。例えば:

public class MixedMap
    public static class MixedType
    {
        public Class<?> cls;
        public Object val;

        public MixedType(Class<?> c, Object v)
        {
            this.cls = c;
            this.val = v;
        }
    }

    public static void main(String args[])
    {   
        MixedType m1 = new MixedType(String.class, "This is a String");
        System.out.println((m1.cls)m1.val);
    }
}

これは私がやろうとしていることであることに注意してください:-)現在、それを訴えてコンパイルしていませんm1 cannot be resolved to a type

だから私の質問は、どうすればこれを修正できますか? 同じ目標を達成するための他の方法は歓迎されますが、これがコンパイラの型チェック能力を制限することを私に言って答えないでください-私はそれを知っており、それで問題ありません。

前もって感謝します。

4

2 に答える 2

7

正しいのは ですがm1.cls.cast(m1.val)、通常の と比べて何も得られないことはほぼ確実です Map<String, Object>。タイプ セーフとまったく同じ情報 (つまり、あまり多くない) を取得するより単純なアプローチは、マップ内getClass()の値に対してメソッドを使用することです。Object

これでは、発言できるようになるという目標を達成することはできString value = map.get("str")ません。完全なキャストにほかなりません。あなたができる

Object value = map.get("str");
if (value instanceof String) {
  // do stringy things
}

またはそれらの線に沿った何か。

コンパイル時に使用ポイントでの値の型がわかっている場合、最善の解決策は、使用ポイントでキャストを実行することです。一般に、このような構成を行う「理想的な」方法は、を使用するのではなく、コンパイル時にフィールドとその型を認識するMapカスタマイズされたクラスを構築することですが、を使用する場合は、キャストを直接行うだけです。おそらくあなたの最善の策です。ConfigurationMap

于 2012-04-10T00:17:07.617 に答える
4

私は以前にこれに似たものを実装しました。ジェネリックを使用して支援できます。必要なのは、MixedKeyへのキーとして使用できるMixedMapです。これらの行に沿ったもの:

public class MixedKey<T> {
    public final Class<T> cls;
    public final String key;

    public MixedKey(T cls, String key) {
        this.key = key;
        this.cls = cls;
    }

    // also implement equals and hashcode
}

.

public class MixedMap extends HashMap<MixedKey<?>,Object> {
    public <T> T putMixed(MixedKey<T> key, T value) {
        return key.cls.cast(put(key, value));
    }

    public <T> T getMixed(MixedKey<T> key) {
        return key.cls.cast(get(key));
    }
}

このようなことを行うことの良い点は、誤って間違った型を使用すると、コンパイル時にエラーが発生することです。これは、直接キャストでは得られないものです。

MixedKey<Integer> keyForIntProperty
    = new MixedKey<Integer>(Integer.class, "keyForIntProperty");

// ...

String str = mixedMap.getMixed(keyForIntProperty); // compile-time error

対。

String str = (String)map.get("keyForIntProperty"); // run-time error only
于 2012-04-10T02:23:43.983 に答える