クラスを文字列にマップする を作成しようとしてImmutableMap
います (注: もちろん、これは単なる例です!)。ただし、次のようなもの
ImmutableMap<Class<?>, String> map = ImmutableMap.of(
Integer.class, "Integer",
Date.class, "Date"
);
次のエラーが表示されます
Type mismatch: cannot convert from ImmutableMap<Class<? extends Object&Comparable<?>&Serializable>,String> to ImmutableMap<Class<?>,String>
奇妙なことClass<?>
に、キーのいずれか (!) にキャストを追加すると機能します。
ImmutableMap<Class<?>, String> map = ImmutableMap.of(
Integer.class, "Integer",
Date.class, "Date",
(Class<?>) String.class, "String",
long.class, "Long"
);
うまくいきます。私はこの動作にちょっと戸惑っています: 1 つには、キャストがないと機能しないのはなぜですか? これらはすべてクラスであり、実際には より一般的なものClass<?>
にはなりません。では、なぜ機能しないのでしょうか? 次に、キーのいずれかをキャストすると機能するのはなぜですか?
(補足: なぜ私がそのようなことをしたいのか疑問に思っているなら、そうです、それはリフレクションのためです…)
編集:私は実際にこれが機能することを理解しましたが、上記の動作を理解したいと思います
ImmutableMap<Class<?>, String> map = ImmutableMap.<Class<?>, String>builder()
.put( Integer.class, "Integer" )
.put( Date.class, "Date" )
.build();