我正在用泛型给出我的第一步,我刚刚编写了一个通用函数来比较两个List对象,比如这个
public static <T> List<T> diffAdded(List<T> source, List<T> dest) {
List<T> ret = new ArrayList<T>();
for(T element: dest) {
if (!source.contains(element)) {
ret.add(element);
}
}
return ret;
}
一切正常,但是我实例化了一个ArrayList,因为很明显我无法实例化一个接口List
事实是我想要返回与源相同类型的对象...
你如何处理这种情况?
我现在可以面对这个方法的任何演员问题吗?
非常感谢
答案 0 :(得分:4)
这个问题的答案是几乎总是“返回与源相同类型的对象”实际上并不与您的应用程序相关,并且您正在以错误的方式处理事情
如果您的调用者需要特定的List
实现,因为他们将对其进行特定类型的操作,那么他们可以自己进行复制...但是如果您的方法采用类型的任意参数List
,输出根据输入的确切实现在语义上发生变化,那就是巨大的代码味道。
保持代码不变,如果方法的调用者确实需要特定的实现,那么他们可以将输出复制到该实现中。
答案 1 :(得分:1)
你在这里有两个选择。
1:意识到接受List<T>
接口作为输入类型意味着您明确表示您并不关心底层实现。此外,通过返回List<T>
,它表示您的调用者也不应该关心底层实现。在大多数情况下,List
是List
,细节不重要。如果是,则应明确返回ArrayList<T>
。
2:进行一系列与您要支持的每个List
实现类型匹配的多态调用。
我非常认为第一个答案是你应该指导你的努力。