我对通用性,继承和接口有一个基本问题。
给出以下代码:
import java.util.ArrayList;
import java.util.List;
public class Generics {
private Class1 obj1 = new Class1();
public Generics() {
Class1 obj1 = new Class1();
Class2 obj2 = new Class2();
Class2 obj3 = new Class2();
Class2 obj4 = new Class2();
List<Class2> obj1Children = new ArrayList<Class2>();
obj1Children.add(obj2);
obj1Children.add(obj3);
obj1Children.add(obj4);
}
public static void main(String[] args) {
Generics g = new Generics();
}
private class Class1 implements I1 {
private List<I2> children;
@Override
public List<I2> getChildren() {
return children;
}
@Override
public void setChildre(List<I2> children) {
this.children = children;
}
}
private class Class2 implements I2 {
}
private interface I1 {
List<I2> getChildren();
void setChildre(List<I2> children);
}
private interface I2 {
}
}
在Class1中,如果您更改以下行:
private List<I2> children;
和
private List<Class2> children;
然后我有一个编译错误,告诉我它不能将List强制转换为List。
我很困惑,因为我认为接口的全部目的是摆脱事物的实现方面。
有人可以解释吗?
I1
明确定义了一种返回的类型的方法List<I2>
。您不能在实现类中出于任何原因将其更改为return List<Class2>
;这就是界面的重点。您的执行合同会在任何情况下I1
迫使您退还某种形式的List<I2>
款项。
除了接口实现对您施加的限制之外,您还应该知道“泛型”不是宽容的;它应该是“宽容的”。在I2
中List<I2>
不能转换为别的。甚至没有相同层次结构中的类。在这方面,java提供的类型安全性非常严格
考虑一下:
Class2
是 I2
List<Class2>
定义一个类型安全集合Class2
小号List<I2>
定义的类型安全集合 I2s
List<Class2>
替换List<I2>
。不在变量声明,方法参数或方法返回值中本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句