1
   protected List<? extends ErrorTO> errors = new ArrayList<ErrorTO>();

    public abstract Collection<? extends ErrorTO> getErrors();

    public void registerError(ErrorTO e) {
        errors.add(e);
    }

“errors.add(e)”行有一个编译错误,它期待某种类型的“?扩展 ErrorTO”并且不喜欢 ErrorTO?为什么要解决这个问题?谢谢!

4

4 回答 4

2

编译器不知道getErrors会返回一个Collection<ErrorTo>; 它可能会返回一个Collection<SomeSubclassOfErrorTo>. 如果您随后尝试将ErrorTo不属于此子类的对象添加到集合中,则会违反类型安全性。出于这个原因,编译器不会让你这样做。

于 2012-07-04T21:44:50.697 回答
1

您不能向List<? extends ErrorTO>. 使它成为一个List<ErrorTO>.

List<? extends ErrorTO>表示:一些未知类的列表,即 ErrorTO 或扩展 ErrorTO。所以很明显,如果你可以给它添加一些东西,它的类型安全就会被破坏。

于 2012-07-04T21:45:45.770 回答
1

List<? extends ErrorTO>不是一个可以包含任何扩展的列表ErrorTO

它是一个(未指定)子类的列表ErrorTO

如果MyErrorTOextends ErrorTO,那么我可以创建一个List<MyErrorTO>并将其分配给errors.

然后,您的代码将尝试将一个添加ErrorTO到我的列表中,这是非法的 - 我的列表只能包含一个特定的子类ErrorTO

于 2012-07-04T21:47:31.667 回答
0

也许这会有所帮助。假设我们有课

class Fruit {}
class Pear extends Fruit{ void methodA(){} }
class Apple extends Fruit{ void methodB(){} }

我们想创建这样的方法

public static void method(List<? extends Fruit> list, Fruit f) {
    list.add(f); //<-- why is this forbidden?
}

作为list参数,此方法可以接受类似的列表

ArrayList<Fruit>
ArrayList<Apple>
ArrayList<Pear>

如果参数是,new ArrayList<Pear>();那么编译器不应该允许添加像 Fruit 或 Apple 这样的元素。

但是编译器不知道他将处理什么样的列表。由于缺乏知识,不可能通过List<? extends Fruit> list参考添加任何元素。

于 2012-07-04T22:36:54.777 回答