我有以下课程:
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子类型的通用方法.我做错了什么还是这个设计?如果是这样,有没有解决方法?提前致谢.
你应该使用<? super DTO>(或者<? super SubscriptionDTO>,正如汤姆霍廷 - 强调指出的那样)作为通用参数ArrayList.
从Effective Java的第28 项(样本章 [pdf]的第28页):
这是一个助记符,可以帮助您记住要使用的通配符类型:
PECS代表生产者延伸,消费者超级.
换句话说,如果参数化类型代表
T生产者,则使用<? extends T>; 如果它代表T消费者,请使用<? super T>.
在这种情况下,l是消费者(您将对象传递给它),因此<? super T>类型是合适的.