为什么不能在Java中创建通用填充方法?

Igo*_*aya 2 java generics

我有以下课程:

abstract class DTO{ }

class SubscriptionDTO extends DTO { }
Run Code Online (Sandbox Code Playgroud)

以及以下通用方法:

protected void fillList(ResultSet rs, ArrayList<? extends DTO> l)
        throws BusinessLayerException {
    SubscriptionDTO bs;
    try {
        while (rs.next()){
            //initialize bs object...
            l.add(bs); //compiler error here
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }

}
Run Code Online (Sandbox Code Playgroud)

我似乎无法理解为什么你不能创建一个填充DTO子类型的通用方法.我做错了什么还是这个设计?如果是这样,有没有解决方法?提前致谢.

Mic*_*ers 7

你应该使用<? super DTO>(或者<? super SubscriptionDTO>,正如汤姆霍廷 - 强调指出的那样)作为通用参数ArrayList.

Effective Java的第28 项(样本章 [pdf]的第28页):

这是一个助记符,可以帮助您记住要使用的通配符类型:

PECS代表生产者延伸,消费者超级.

换句话说,如果参数化类型代表T生产者,则使用<? extends T>; 如果它代表T消费者,请使用<? super T>.

在这种情况下,l是消费者(您将对象传递给它),因此<? super T>类型是合适的.