泛型集合PECS

Álv*_*uiz 6 java

我对此方法有疑问java.util.Collections:

public class Collections {  
  public static <T> void copy(List<? super T> dest, List<? extends T> src) {  
      for (int i=0; i<src.size();i++)   
        dest.set(i,src.get(i));   
  }   
}
Run Code Online (Sandbox Code Playgroud)

我知道如何<? super T>工作,但是,我不明白为什么第一个参数List<? super T>代替List<T>.我认为在这种情况下它没用.
使用也List<T>应该工作,不应该吗?
如果可能的话,你能给我一些例子来理解吗?

谢谢.

Jon*_*eet 5

不,这很有道理.例如,考虑这种情况:

  • TInputStream
  • dest 是一个 List<Object>
  • src 是一个 List<FileInputStream>

这非常好.当然,你可以T任何ObjectFileInputStream在这种情况下-但是想象一下,你在调用这个来自与一个签名的方法:

public void doSomething(List<? super InputStream> streams) {
    // I want to use copy in here for some reason
}
Run Code Online (Sandbox Code Playgroud)

你不知道它是List<InputStream>- 只是它是一个List<? super InputStream>.如果dest在参数copy只是 List<T>,我们就被卡住......但它的方式写的,我们很好.

从目的地列表中我们需要的内容也是有意义的 - 我们需要能够设置其中的值T.同样,我们对源列表的要求是我们可以从中获取值T.<? super T><? extends T>很好地表达这些要求.