【问题标题】:Java extending class typesJava 扩展类类型
【发布时间】:2014-12-02 18:58:27
【问题描述】:

我有以下代码 sn-p 返回类型不匹配错误:

@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() 的参数化返回类型中使用“?扩展 SuperClass”还是仅使用“SuperClass”,我仍然看到同样的错误。我也尝试过只扩展 SomeClass ,但这也没有奏效。

【问题讨论】:

    标签: java generics inheritance collections


    【解决方案1】:

    您的SubClassSuperClass 的子类型,但Map&lt;String, Class&lt;SubClass&gt;&gt; 不是Map&lt;String, Class&lt;SuperClass&gt;&gt; 的子类型。更多信息可以查看Generics, Inheritance, and Subtypes

    对于 Java SE 7,您可以使用:

    return Collections.<String, Class<? extends SomeClass.SuperClass>>singletonMap("hello", SomeClass.SubClass.class);
    

    【讨论】:

    【解决方案2】:

    我认为有一个错字。应该是:

    @SuppressWarnings("rawtypes")
        public Map<String, Class<? extends SomeClass.SuperClass>> subClass() {
            return Collections.singletonMap("hello", SomeClass.SubClass.class);
        }
    

    你错过了.class :)


    在 Java 中,泛型是不变的。这意味着如果:

    Dog 扩展 Animal 然后 List&lt;Dog&gt; 扩展 List&lt;Animal&gt;

    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 中出现类型不匹配错误。
    • 我正在使用 Java8。它在我的身上编译得很好。
    • 我有 Java 7 (1.7.0_67)
    • 那么这只是 Java 8 的一个特性吗?我正在研究它
    • 我阅读了 Java 8 whats new 页面,但没有看到任何可能导致此问题的新内容。我以为可能是Netbeans这样用javac和Ideone编译的,都没有编译。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 2013-10-30
    • 2016-01-15
    • 1970-01-01
    相关资源
    最近更新 更多