Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.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 通配符类型的协方差和逆变换_Java_Generics_Covariance_Contravariance - Fatal编程技术网

Java 通配符类型的协方差和逆变换

Java 通配符类型的协方差和逆变换,java,generics,covariance,contravariance,Java,Generics,Covariance,Contravariance,请您解释一下为什么可以这样做: import java.util.ArrayList; import java.util.List; public class Covariance { class A { } class B extends A { } class C extends A { } public void testSmth() throws Exception { List<? extends

请您解释一下为什么可以这样做:

import java.util.ArrayList;
import java.util.List;

public class Covariance {

    class A {
    }

    class B extends A {
    }

    class C extends A {
    }

    public void testSmth() throws Exception {
        List<? extends A> la = new ArrayList<A>();
        A a = la.get(0);
        // la.add(new B()); - doesn't compile

        List<? super B> lb = new ArrayList<A>();
        // lb.add(new A()); - doesn't compile
        lb.add(new B());
        Object object = lb.get(0);
    }

}
很明显,在这个阶段,C的超级类将是B类—Java不允许多重继承

还有为什么它禁止

 lstC.add(new B());
我不清楚。

考虑一下

    List<? extends A> la = new ArrayList<C>();

<代码>列表> P>以理解超级关键字的情况,考虑以下内容:

import java.util.ArrayList;
导入java.util.List;
公共类协方差{
甲级{
}
B类扩展了A类{
}
C类扩展了{
}
类D扩展了C{}
public void testSmth()引发异常{

C
的列表“Super”可以是
A
对象
,但更重要的是
C
。这是真的。不过,不清楚“Super”关键字到底是怎么回事
 B b = lstC.get(0);
 lstC.add(new B());
    List<? extends A> la = new ArrayList<C>();