我有以下代码片段,它返回类型不匹配错误:
@SuppressWarnings("rawtypes")
public Map<String, Class<? extends SomeClass.SuperClass>> subClass() {
return Collections.singletonMap("hello", SomeClass.SubClass.class);
}
类声明如下所示:
public class SomeClass {
public static abstract class SuperClass { }
public static class SubClass extends SuperClass{ }
}
这会返回一个类型不匹配错误,说明:
Type mismatch: cannot convert from Map<String,Class<SubClass>> to Map<String,Class<? extends SuperClass>>
为什么会这样?无论我在subClass()的参数化返回类型中使用“?extends SuperClass”还是“SuperClass”,我仍然会看到同样的错误。我也尝试过只是扩展SomeClass,但这也没有用。
答案 0 :(得分:2)
我认为有一个错字。它应该是:
@SuppressWarnings("rawtypes")
public Map<String, Class<? extends SomeClass.SuperClass>> subClass() {
return Collections.singletonMap("hello", SomeClass.SubClass.class);
}
你错过了.class
:)
在Java中,泛型是不变的。这意味着:
Dog
延伸Animal
然后List<Dog>
延伸List<Animal>
List<Animal> ls = new ArrayList<Dog>() //illegal
因此这是无效代码,不起作用:
Map<String, Class<SomeClass.SuperClass>> hello2 = Collections.singletonMap("hello", SomeClass.SubClass.class);
这是完全没问题的:
Map<String, Class<? extends SomeClass.SuperClass>> hello = Collections.singletonMap("hello", SomeClass.SubClass.class);
return hello;
答案 1 :(得分:2)
您的SubClass
是SuperClass
的子类型,但Map<String, Class<SubClass>>
不是Map<String, Class<SuperClass>>
的子类型。有关详细信息,请参阅Generics, Inheritance, and Subtypes
对于Java SE 7,您可以使用:
return Collections.<String, Class<? extends SomeClass.SuperClass>>singletonMap("hello", SomeClass.SubClass.class);