Java泛型和继承:无法添加到列表

Java泛型和继承:无法添加到列表,java,generics,inheritance,Java,Generics,Inheritance,假设我有一个如下的列表定义 private List<? extends GeneralBudgetYearBean> budgetYearBeans; // + Getters/setters... 错误是: The method add(capture#6-of ? extends GeneralBudgetYearBean) in the type List<capture#6-of ? extends GeneralBudgetYearBean> is not

假设我有一个如下的列表定义

private List<? extends GeneralBudgetYearBean> budgetYearBeans;

// + Getters/setters...
错误是:

The method add(capture#6-of ? extends GeneralBudgetYearBean) in the type List<capture#6-of ? extends GeneralBudgetYearBean> is not applicable for the arguments (GeneralBudgetYearBean)
这没有道理。是因为?扩展T与T不同,在这里T不能被替换吗

我需要能够在没有细节的情况下大致操纵这个类。在某个时刻,会有一个在扩展类中构造的SUBGeneralBudgetYearBeans的ArrayList,这就是为什么我需要使用?扩展通用预算earbean表示法。

根据以下原则:

仅需要获取对象时使用extends,仅需要添加对象时使用super

在你的情况下

private List<? extends GeneralBudgetYearBean> budgetYearBeans;
在本例中,您将能够将budgetYearBean实例化为:


在这两种情况下,您都可以添加GeneralBudgetEarbean和SubBudgetEarbean对象。

当您使用表达式列表时,删除通配符,在这种情况下它们不会真正帮助您,它们只会使事情复杂化,除非您真的知道自己在做什么

private List<GeneralBudgetYearBean> budgetYearBeans = ...

public List<GeneralBudgetYearBean> getBudgetYearBeans() {
    return budgetYearBeans;
}
。。。或者作为一个列表

List<SUBGeneralBudgetYearBean> sgybs = ...
getBudgetYearBeans().addAll(sgybs);

看到了吗?实际上不需要通配符:

那个列表呢?@sp00m我不能用那个。正如我所说的,在某个时刻会构建一个ArrayList,而?扩展表示法是实现这一点的唯一方法。@geneb。这不是问题。您仍然可以将SubBudgetYearBeans添加到列表中。不,不是这样。在扩展类中,我必须这样做:setBudgetYearBeansnew ArrayList。这将产生一个错误。请不要对列表使用setter。只需使用getBudgetYearBeans.clear,然后使用getBudgetYearBeans.addAllsubBudgetBeans。
budgetYearBeans = new ArrayList<Object>();
budgetYearBeans = new ArrayList<GeneralBudgetYearBean>();
class xxx<T extends GeneralBudgetYearBean> {
    private List<T> budgetYearBeans; // getter and setter
T gbyb;
getBudgetYearBeans().add(bgyb);
private List<GeneralBudgetYearBean> budgetYearBeans = ...

public List<GeneralBudgetYearBean> getBudgetYearBeans() {
    return budgetYearBeans;
}
SUBGeneralBudgetYearBean sgyb = ...
getBudgetYearBeans().add(sgyb);
List<SUBGeneralBudgetYearBean> sgybs = ...
getBudgetYearBeans().addAll(sgybs);