5
Object stringMap = new HashMap<String, String>(){{ put("1", "a"); }};
Map<Integer, String> integerMap = (Map<Integer, String>)stringMap; // Why doesn't Java throw an exception at run-time?

// I know this is not a problem if stringMap is declared as Map<String, String>.
// However, the actual code above was using Spring Bean.
// Map<Integer, String> integerMap = (Map<Integer, String>)context.getBean("map");

System.out.println(integerMap.get(1)); // prints null
System.out.println(integerMap.get("1")); // prints a

Q1. Javaが実行時にそのようなキャストを許可するのはなぜですか?

Q2. Bean を使用している場合、このエラーを回避するためのベスト プラクティスは何ですか?

4

4 に答える 4

0

型消去のため、runtymeでは文句を言わないと思います(http://docs.oracle.com/javase/tutorial/java/generics/erasure.html)。実行時に、このマップの宣言に違いはありません。

于 2012-07-10T08:58:02.947 に答える
0

チェックされていないキャストでコンパイラの警告が表示されます。問題は、型消去の問題(下位互換性を確保するためにあります)のために、コンパイルされたバイトコードに一般的な情報がないため、JVMに関する限り、HashMap<anything,anything>extendsMap<anythingelse,anythingelse>です。

質問2に関して:あなた警告を受けていました。それらを無視しないでください!;)

于 2012-07-10T09:01:27.077 に答える
0

SpringコンテキストからMapインスタンスをフェッチしている場合、型の安全性を維持する方法はありません。Spring BeanFactoryはランタイムコンテナであり、インスタンスのジェネリック型パラメータが何であるかについての手がかりはありません。

于 2012-07-10T10:12:37.603 に答える