Java扩展类类型

标签 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,但这也没有奏效。

最佳答案

您的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);

关于Java扩展类类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27256894/

相关文章:

java - 通过 List<?> 从 List<subclass> 向上转换为 List<superclass>

java - 当一个抽象类扩展一个具体类时,继承的成员会变成抽象的吗?

Scheme 中的继承类

java - 三星 Galaxy 手机固定为请勿打扰(派)

java - Envers在没有审计记录时在ValidityAuditStrategy中抛出RuntimeException(表分区)

java - Ajax 响应返回 null

java - 如何在 Rest 请求体内使用带有单字符序列构造函数/工厂方法的对象而不是单字符串构造函数?

c# - 使用泛型进行显式转换

java - 克服泛型投入-获取规则

java - 如何从父类(super class)中实例化子类