今日、私は、オブジェクトが正しいタイプにキャストできない場合でも、Map
にあるオブジェクトをput
にできることを発見しました。オブジェクトは、初期化されたマップに一貫性のない型を置くことが予想され、合法ですか?
まず、私は簡単な例から始めてみましょう:あなたはないが既に構築地図に一貫性のない型のオブジェクトを置くことができるはずと
Map<Integer, String> myMap = new HashMap<>(); //plain old hashmap
myMap.put(9,"star"); //no problem
myMap.put(10, 1.2); //Incompatible type, the compiler yells
Map<Integer, Double> aMap = (Map<Integer, Double>) myMap; //Cannot cast, the compiler yells
はこれまでのところ、すべてが、期待されています。今度は、このことを考えてみましょう:
public class NoRulesForMe {
static Object theRing;
public static void main(String[] args){
Map<Integer, String> myMap = new HashMap<>();
myMap.put(9,"star");
Map<Integer, Double> myMapMorphed = castWildly(myMap);
myMapMorphed.put(99, 3.14);
System.out.println(myMapMorphed.get(9)); //"star", as we put in
System.out.println(myMapMorphed.get(99)); //3.14, as we put in
}
public static <T> T castWildly(Object value){
theRing = value;
T morphed = (T) theRing;
return morphed;
}
}
私は、これは、実行時エラーが発生しなかったことを驚いている - どのように地図を達成しないと、この動作はJLSやAPIに指定されているので、に依存することができます?
理由私は、より生産性の高いコードでこのことを知っていることを伺いたいと思いますが、これは混乱しているかもしれませんが、機能的に作業することが保証できます。どんな入力も感謝します。
あなたはgoogleの "タイプ消去"する必要があります。 –
これは、Javaがジェネリックを実装していることに固有です。 –
@LouisWasserman Javaのジェネリックスには*何が付いているのですか?私はコンパイラが不平を言っていないのは驚きではない。しかし、もっと大きな疑問は、Javaが 'Double'を' String'としてどのように格納できるかということです。 – flow2k