Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 泛型下限(';super';)问题?_Java_Generics - Fatal编程技术网

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的评论

  • 对于
    List
    List“?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>();