我正在阅读Java中的通配符主题,我在下面的代码中遇到了这个问题
static <T> void type(List<? super T> list){
//...
}
static <T> void type2(List<? extends T> list){
//...
}
如果您通过此代码调用这些方法,则会出错并且这是可以理解的
List<?> unbounded=new ArrayList<Long>();
//! type(unbounded); //:Error here
//! type2(unbounded); //:Same Error here
但是如果你通过添加一个额外的arg来改变这些方法的签名,就像这样
static <T> void type(List<? super T> list, T arg){
//...
}
static <T> void type2(List<? extends T> list, T arg){
//...
}
并通过
调用它们List<?> unbounded=new ArrayList<Long>();
Long lng=90L;
//! type(unbounded,lng); //:Error here
type2(unbounded,lng); //No error in this one now
为什么这种行为只需添加一个额外的arg?如何通过添加一个xtra arg ??
来限制列表接受无界限