java - 修改后的 Collections.copy

标签 java generics

Collections.copy 定义为:

public static <T> void copy(List<? super T> dest, List<? extends T> src)

我了解它的工作原理并且没有任何问题。我尝试编写另一种方式来展示与以下内容相同的内容:

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
    }

这个想法很简单。对于从源读取的任何类型,目标类型都应该是它的父类(super class)型。所以现在你可以这样做:

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>());

看起来不错。但是与实际 Collections.copy 相比,以上是否有任何缺陷? ?从类型信息的角度来看,有什么地方实际比上面的好吗?

最佳答案

我认为原始版本更好的一个地方是简洁。特别是从代码生成的角度来看。

如果我调用完整声明的原始函数,我可以

Collections.<Object>copy(new ArrayList<Object>(), new ArrayList<Number>());

在我的例子中是:

MyClass.<Object, Number> copy(new ArrayList<Object>(), new ArrayList<Number>());

所以它更简洁一些。

关于java - 修改后的 Collections.copy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28540345/

相关文章:

java - 如何在java中表示50亿和连续整数值

java - 适合在 rxjava 中使用 Func0 和 Action1 有什么区别

c# - 我怎样才能使这些方法通用?

java - Java中的递归接口(interface)类型参数

c# - 强制用户在 C# 中使用正确的泛型方法

java - 测试 EJB 3.0 组件

Java 线程使用 websocket 更改数据和向用户提供数据的线程

c# - 取决于类型 T 的枚举

c# - 为什么这在代码 'IResult<H>'

java - 更改 JAX-WS 默认 XML 命名空间前缀