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"
);