我经常发现List,Set的声明,什么意思?表示包含T在内的任意T的父类,表示包含T在内的任意T的子类。下面具体分析一下这两个通配符的具体区别。extendsListfoo3的通配符声明表示下面的赋值是合法的://Number"extends"Number(inthiscontext)Listfoo3=newArrayList();//IntegerextendsNumberListfoo3=newArrayList();//DoubleextendsNumberListfoo3=newArrayList();读取操作通过上面给出的赋值语句,你必须能够从foo3列表中读取到什么类型的元素?您可以阅读Number,因为上面的列表包含一个Number元素或一个Number-like元素。您不能保证读取一个Integer,因为foo3可能指向一个List。您不能保证读取Double,因为foo3可能指向List。写完上面给出的赋值语句后,你可以合法地向foo3中插入??什么类型的元素?您不能插入Integer元素,因为foo3可能指向List。您不能插入Double元素,因为foo3可能指向List。您不能插入Number元素,因为foo3可能指向List。你不能向List中插入任何类型的对象,因为你不能保证这个列表实际指向的是什么类型,你也不能保证列表中实际存储的是什么类型的对象。***保证的是你可以从中读取T或T的子类。super现在考虑List。Listfoo3的通配符声明意味着下面的赋值是合法的://Integerisa"superclass"ofInteger(inthiscontext)Listfoo3=newArrayList();//NumberisasuperclassofIntegerListfoo3=newArrayList();//ObjectisasuperclassofIntegerListfoo3=newArrayList