2010-10-27 106 views

回答

14

func需要被定义为

public void func(List<? extends base> list) { ... } 

这是因为List<derived>实际上不是一个List<base>,因为List<base>允许任何形式的在它base,而List<derived>只允许derived和它的子类。使用? extends base可确保除null之外的任何内容都不能添加到List,因为您不确定该列表可能允许的base的子类。另外,您应该尝试遵循标准的Java命名约定......以小写字母开头的类看起来很奇怪,就像它们是原始类似的。

4

这是因为如果允许通过列表<派生>,func()将能够向列表添加基类型元素,从而使列表的通用契约失效(应该只允许派生类型的元素)键入内容)

如果在另一方面,你定义FUNC为

public void func(List<? extends base> list) 

你仍然可以检索列表基本类型元素,只是将无法对任何新的元素添加到它,这正是你想要的行为。

0

要解释的Java的这种行为,看看下面这个例子

void addItem(List<Base> list) { 
    list.add(new Base()); 
} 

List<Base> l1 = new ArrayList<Base>(); 
addItem(l1); 
Base b = l1.get(0); 

List<Derived> l2 = new ArrayList<Derived>(); 
addItem(l2); 
Derived d = l2.get(0); // Would cause runtime exception. 

这就是为什么这个代码将无法在第一时间编译。