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相比,上面有任何缺陷吗?从类型信息的角度来看,实际上是否超过上述的任何地方?
假设两个 ArrayList 中都有对象。然后您迭代源并将每个对象从源添加到目标。问题是,从源获取并添加到目标的每个对象都将指向相同的内存位置。例如,说
source {x, y}
destination {x, y}.
Run Code Online (Sandbox Code Playgroud)
在这种情况下,源和目标中的 x 将指向相同的内存位置
| 归档时间: |
|
| 查看次数: |
275 次 |
| 最近记录: |