为什么创建带番石榴的工厂会出现类型不匹配错误?

daw*_*awi 3 java guava

我正在尝试创建一个工厂(从String参数生成新实例).

我有一个Monster类(超类)和Robot1类(扩展了Monster).

我的工厂声明:

private static final ImmutableMap<String, Class<? extends Monster>> DISPATCHER = ImmutableMap.of("robot1", Robot1.class);
Run Code Online (Sandbox Code Playgroud)

但我得到:

Type mismatch: cannot convert from ImmutableMap<String,Class<Robot1>> to ImmutableMap<String,Class<? extends Monster>>
Run Code Online (Sandbox Code Playgroud)

Lou*_*man 6

这样就足够了

private static final ImmutableMap<String, Class<? extends Monster>> DISPATCHER = 
   ImmutableMap.of("robot1", (Class<? extends Monster>) Robot1.class);
Run Code Online (Sandbox Code Playgroud)

Java倾向于假设您希望尽可能使用最具体的类型,即使您不这样做.这个upcast不会产生任何警告,因为它非常安全 - 它只是告诉Java编译器你想要更通用的类型.