在Java泛型参数中使用父类

时间:2017-02-07 10:54:14

标签: java generics

我不明白Java中的泛型是如何完全运行的。我有类似的情况,我在下面的代码简化:

public static void main(String[] args) {
    Map<String, Collection<B>> map1 = test();
    Map<String, List<B>> map2 = test();
    Map<String, ArrayList<B>> map3 = test();
} 

private static Map<String, ArrayList<B>> test() {
    return null;
}

创建map1或map2时,我收到一个错误,指出不兼容的类型 - 它期待ArrayList,但是得到了Collection / List。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

这里是成功编译的代码:

public static <B> void main(String[] args) {
    Map<String, ? extends Collection<B>> map1 = test();
    Map<String, ? extends List<B>> map2 = test();
    Map<String, ArrayList<B>> map3 = test();
}

private static <B> Map<String, ArrayList<B>> test() {
    return null;
}

您需要添加? extends Collection<B>? extends List<B>,因为撰写? extends Collection表示构成Object的{​​{1}}的{​​{1}}是value Map的{​​{1}}因此sub type会被调用,因为它还会返回Collection test()类型的Map,这实际上是value一个ArrayList sub type

另请注意,您需要在Collection<B>

的签名中添加main

希望它有所帮助!