给定一个简单的类,它表示一个人的年龄和姓名:
public class Parent {
private final String value;
public Parent(String value) {
this.value = value;
}
@Override
public String toString() {
return value;
}
}
...以及它的一个子类...
public class Child extends Parent {
public Child(String value) {
super(value);
}
}
以下程序可以编译并且执行没有错误或警告:
public class Main {
public static void main(String[] args) {
List<? extends Parent> items = getItems();
for (Parent p : items) {
System.out.println(p.toString());
}
}
private static List<? extends Parent> getItems() {
List<Parent> il = new ArrayList<Parent>();
il.add(new Parent("Hello"));
il.add(new Child("World"));
return il;
}
}
但是getItems()
的返回类型怎么办?对我来说,这似乎在语义上是错误的,因为函数的结果确实包含一个不是Parent
子类的Parent
对象,这不符合该方法签名的预期。鉴于这种行为,我本来希望返回一个简单的List<Parent>
类型。然而,由于编译器没有抱怨,我错过了什么吗?除了对结果列表进行(不必要的)“写入保护”之外,这种实现是否有任何好处?还是这是Java样式的结果列表写入保护(例如,在不需要创建复制品的情况下公开对象的字段列表)?还是这可以被认为是“错误”的(从教学角度来看)?如果是这样,那么为什么编译器甚至连Eclipse都没有抱怨它,甚至没有显示提示?
Parent
的变量中。但你不知道 - TheConstructorParent
是Parent
的子类,2.该列表不是“写保护”的:您仍然可以添加null
(或删除元素)。 - Marco13