Java 使用类<;创建ImmutableMap时出现问题&燃气轮机;作为关键

Java 使用类<;创建ImmutableMap时出现问题&燃气轮机;作为关键,java,class,generics,reflection,guava,Java,Class,Generics,Reflection,Guava,我试图创建一个ImmutableMap,将类映射到字符串(注意:当然,这只是一个示例!)。然而,类似于 ImmutableMap<Class<?>, String> map = ImmutableMap.of( Integer.class, "Integer", Date.class, "Date" ); ImmutableMap&Serializable>,String>到ImmutableMap到任何(!)键,即 ImmutableMap<

我试图创建一个
ImmutableMap
,将类映射到字符串(注意:当然,这只是一个示例!)。然而,类似于

ImmutableMap<Class<?>, String> map = ImmutableMap.of( 
    Integer.class, "Integer", 
    Date.class, "Date" 
);
ImmutableMap&Serializable>,String>到ImmutableMap
到任何(!)键,即

ImmutableMap<Class<?>, String> map = ImmutableMap.of(
    Integer.class, "Integer",
    Date.class, "Date",
    (Class<?>) String.class, "String",
    long.class, "Long"
);
ImmutableMap
,为什么它不起作用?第二,为什么对任何一个关键点施法都能使其发挥作用

(旁注:如果你想知道我为什么要做这样的事——是的,这是因为思考…)

编辑:事实上,我刚刚发现这是可行的,但我仍然想了解上述行为

ImmutableMap<Class<?>, String> map = ImmutableMap.<Class<?>, String>builder()
    .put( Integer.class, "Integer" )
    .put( Date.class, "Date" )
    .build();
ImmutableMap,String>builder()
.put(Integer.class,“Integer”)
.put(Date.class,“Date”)
.build();

当您传递不一致的方法参数时,编译器就是这样推断类型参数的。 如果您注意到,该方法对
Date
Integer
使用相同的类型参数
K
。有人会认为这应该失败,因为我们传递的是不一致的方法参数,这意味着我们为同一类型参数
K
传递的是不同的类型。但令人惊讶的是,事实并非如此

Class
Class
可转换为以下所有功能:

  • Class>
因此,将类型
K
推断为以下所有类型的混合:

K := Class<? extends Object&Serializable&Comparable<?>>
K:=Class>
这就是该方法的返回值:

ImmutableMap<Class<? extends Object&Serializable&Comparable<?>>, String>
ImmutableMap,String>map=ImmutableMap.,String>

奇怪的是,如果我在
的任何(!)键中添加一个cast,它确实会起作用

只要将任何元素类型强制转换为
,因为
表示所有
实例的族,因此它是所有
实例的通用超类型。因此,类型参数将自动推断为
Class
。它会很好的工作

ImmutableMap<Class<? extends Object&Serializable&Comparable<?>>, String>
ImmutableMap<Class<?>, String> map = ImmutableMap.<Class<?>, String>of( 
    Integer.class, "Integer", 
    Date.class, "Date" 
);