的Java扩展类类型
我有下面的代码片段,它返回一个类型不匹配错误:的Java扩展类类型
@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,但也没有奏效。
您的是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);
我觉得有一个错字。它应该是:
@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;
这仍然给出了类型不匹配的错误在Netbeans的。 – 2014-12-02 19:11:18
我正在使用Java8。它对我的编译很好。 – Jatin 2014-12-02 19:12:00
我有Java 7(1.7.0_67) – 2014-12-02 19:16:07
显式类型参数是一个很好的观点,Java 8可以自动调用它吗? – 2014-12-02 20:11:37
这是[Type inference](https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html)和[Target Typing](目标打字)(http://docs.oracle.com/javase/tutorial/) java/javaOO/lambdaexpressions.html#target-typing)东西。 – 2014-12-02 20:26:06