3

、から、に拡張Integerする、またはを格納し、キャストせずに取得したいと思います。その理由は、最終的には多くの異なるサブタイプがあり(私は説明のために/のみを使用しています)、異なるサブタイプが導入されたときに新しいメソッドを作成する必要がないためです。またはにキャストすることなく、以下を構成して呼び出すことはできますか?DoubleNumberHashMapNumberIntegergetFromMap()DoubleInteger

public class MapOfContent {
    static Map<String, Number> hm = new HashMap<String, Number>();

    public static void main(String[] args) {
        addToMap(hm, Integer.valueOf(3), "An Integer");
        addToMap(hm, Double.valueOf(3.4), "A Double");

        Double d;

        d = (Double) getFromMap(hm, "A Double");
        //d = getFromMap(hm, "A Double");

        System.out.println("Result-> " + d);

    }

    private static void addToMap(Map<String, ? super Number> hashmap, Number c, String key) {
        hashmap.put(key, c);
    }

    private static <T> Number getFromMap(Map<String, ? extends Number> hashmap, String cmsKey) {
        return hashmap.get(cmsKey);
    }
}
4

2 に答える 2

2

このアプローチを実際にタイプセーフにする方法はありません。あなたが試した場合はどうなります(Double) getFromMap(hm, "An Integer")か?それは失敗するはずです。

考えられる代替案の1つは、実際のClassオブジェクトをキーとして使用することです。たとえば、Guava ClassToInstanceMapを使用します。

ClassToInstanceMap<Number> map = MutableClassToInstanceMap.create();
map.putInstance(Integer.class, Integer.valueOf(3));
map.putInstance(Double.class, Double.valueOf(3.4));

Double aDouble = map.getInstance(Double.class); // no cast required
于 2012-07-14T14:24:34.087 に答える
0

異なるクラスのオブジェクトをコレクションに格納していて、それらをフェッチする場合は、共通の祖先だけでなく、実際のタイプのフィールド/メソッドにアクセスする必要があります。

どこかに明示的なキャストがあります。あなたができる最善のことは、それを深く押し込み、コードの他のすべての部分から隠すことClassToInstanceMapです。

于 2012-07-14T14:24:59.453 に答える