10

クラスを文字列にマップする を作成しようとして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();
4

1 に答える 1