我正在迈出使用泛型的第一步,我刚刚编写了一个泛型函数来比较两个 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,因为显然我无法实例化一个接口(interface) List
事实是我想返回一个与源类型相同的对象...
遇到这种情况你会如何处理?
我现在的方法会遇到任何转换问题吗?
非常感谢
最佳答案
这个问题的答案几乎总是“返回与源类型相同的对象”实际上与您的应用程序无关,并且您正在以错误的方式处理事情.
如果您的调用者需要特定的 List
实现,因为他们将对其执行特定类型的操作,那么他们可以自己进行复制...但是如果您的方法采用任意List
类型的参数,并且输出根据输入的确切实现在语义上发生变化,那么这是一个巨大的代码味道。
保持代码不变,如果方法的调用者确实需要特定的实现,那么他们可以将您的输出复制到自己的实现中。
关于java:针对接口(interface)进行编程,但必须实例化一个具体类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9385533/