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>();