修改了Collections.copy

Jat*_*tin 9 java generics

Collections.copy 定义为:

public static <T> void copy(List<? super T> dest, List<? extends T> src)
Run Code Online (Sandbox Code Playgroud)

我理解它是如何工作的,没有任何问题.我尝试用另一种方式展示相同的:

public static <T, E extends T> void copy(List<T> dest, List<E> src){
        for(E e: src){
            dest.add(e);
        }//ignore implementation. it has flaws. The focus is declaration of copy
    }
Run Code Online (Sandbox Code Playgroud)

这个想法很简单.对于从源读取的任何类型,目标类型应为其超类型.所以现在你可以这样做:

copy(new ArrayList<Number>(), new ArrayList<Number>());
copy(new ArrayList<Number>(), new ArrayList<Integer>());
copy(new ArrayList<Object>(), new ArrayList<Number>());
copy(new ArrayList<Object>(), new ArrayList<Double>());
Run Code Online (Sandbox Code Playgroud)

它看起来还不错.但是与实际的Collections.copy相比,上面有任何缺陷吗?从类型信息的角度来看,实际上是否超过上述的任何地方?

niy*_*asc 0

假设两个 ArrayList 中都有对象。然后您迭代源并将每个对象从源添加到目标。问题是,从源获取并添加到目标的每个对象都将指向相同的内存位置。例如,说

source {x, y}
destination {x, y}.
Run Code Online (Sandbox Code Playgroud)

在这种情况下,源和目标中的 x 将指向相同的内存位置