Java扩展类类型

时间:2014-12-02 18:58:28

标签: java generics inheritance collections

我有以下代码片段,它返回类型不匹配错误:

@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 个答案:

答案 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)

您的SubClassSuperClass的子类型,但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);