我是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
答案 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>();
从java 7开始,您可以使用菱形运算符来推断实例化部分中的泛型类型:
list1 = new LinkedList<>();