Java 泛型下限(';super';)问题?
可能重复:Java 泛型下限(';super';)问题?,java,generics,Java,Generics,可能重复: 我无法将我的知识与下面的示例程序联系起来。请看下面的示例程序,然后我的疑问就在该程序下面 import java.util.*; class A { } class B extends A { } class C extends B { } public class sampleprog { public static void main(String[] args) { List<? super A> list1 = new ArrayL
我无法将我的知识与下面的示例程序联系起来。请看下面的示例程序,然后我的疑问就在该程序下面
import java.util.*;
class A { }
class B extends A { }
class C extends B { }
public class sampleprog {
public static void main(String[] args) {
List<? super A> list1 = new ArrayList<A>();
list1.add(new A());//valid. ok
list1.add(new B());//valid, why? it is not super to A?
list1.add(new C());//valid, why? it is not super to A?
List<? super B> list2 = new ArrayList<A>();
list2.add(new A());//not valid. why? it is also super to B!!!
list2.add(new B());
list2.add(new C());
List<? super C> list3 = new ArrayList<C>();
list3.add(new A());//not valid, why? It is super to A so should be valid!!!
list3.add(new B());//not valid, why? It is super to A so should be valid!!!
list3.add(new C());
}
}
import java.util.*;
A类{}
类B扩展了{}
类C扩展了B{}
公共类抽样程序{
公共静态void main(字符串[]args){
列表如果我们在泛型声明中使用?super
,则引用可以指向相同的泛型集合类型或超泛型集合类型。因此,在这种情况下,通过IS-a测试的所有内容都是有效的。投票支持@us2012的评论
- 对于
ListList“?super T”表示您可以添加的任何类,它们必须是T或其子类的实例
所以Listbut”?super B“清楚地提到了任何超B的类。所以A和其他类应该是有效的,但不是C?但是根据输出,C是有效的!!!抱歉。仍然不清楚。例如,列表“B和C都是扩展A和B的子类型”意思:ListClear。但我只是怀疑这就是为什么我们要考虑子类?“super”是指“任何超类而不是子类”!!!现在有了“?super T”的新定义就很清楚了,但这是scjp kathy sierra中给出的定义“当您使用时,请稍后让我澄清。这里的解释非常好,但ArrayList
并非优于ArrayList
——您的意思一定是A
优于B
。
List<? super B> list1 = new ArrayList<A>();
List<? super B> list1 = new ArrayList<B>();