对Java中的通配符泛型类型感到困惑

时间:2016-06-05 03:39:31

标签: java generics

我是Java的初学者,我很难理解通配符泛型类型。任何人都可以帮助我理解为什么以下两行不正确?

LinkedList<? extends List> list1 = new LinkedList<ArrayList>();
LinkedList<? super List> list2 = new LinkedList<Collection>();

当我尝试编译它们时,我收到以下错误消息:

Test.java:13: error: incompatible types: LinkedList<ArrayList> cannot be converted to LinkedList<? extends List>
    LinkedList<? extends List> list1 = new LinkedList<ArrayList>();
                                       ^
Test.java:14: error: incompatible types: LinkedList<Collection> cannot be converted to LinkedList<? super List>
    LinkedList<? super List> list2 = new LinkedList<Collection>();
                                     ^
2 errors

1 个答案:

答案 0 :(得分:-3)

如果我们分解第一个,它可能会更有意义:

LinkedList<? extends List> list1

你将list1声明为LinkedList,其元素类型可以与List的任何子类兼容。

list1 = new LinkedList<ArrayList>();

然后尝试将list1实例化为LinkedList,其元素类型仅限于ArrayList。这可能就是为什么编译器会抱怨第一行的不兼容类型。您需要确保List1的声明和实例化的泛型类型是可兼容的,是这样的:

LinkedList<? extends List> list1 = new LinkedList<? extends List>();

我误解了。编译器为上面的行抛出一个错误。这条线确实有用,可能就是你想要的:

LinkedList<List> list1 = new LinkedList<List>();

check out example code here

从java 7开始,您可以使用菱形运算符来推断实例化部分中的泛型类型:

list1 = new LinkedList<>();