2014-12-02 131 views
0

我有下面的代码片段,它返回一个类型不匹配错误:的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,但也没有奏效。

回答

2

您的​​是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); 
+0

显式类型参数是一个很好的观点,Java 8可以自动调用它吗? – 2014-12-02 20:11:37

+0

这是[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

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; 
+0

这仍然给出了类型不匹配的错误在Netbeans的。 – 2014-12-02 19:11:18

+0

我正在使用Java8。它对我的编译很好。 – Jatin 2014-12-02 19:12:00

+0

我有Java 7(1.7.0_67) – 2014-12-02 19:16:07