5

我正在研究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

为什么只是通过添加一个额外的参数来实现这种行为?为什么有界列表仅通过添加一个 xtra arg 就可以接受无界列表?

4

0 回答 0