java:针对接口编程,但必须实例化一个具体的类

时间:2012-02-21 21:36:06

标签: java generics interface

我正在用泛型给出我的第一步,我刚刚编写了一个通用函数来比较两个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

事实是我想要返回与源相同类型的对象...

你如何处理这种情况?

我现在可以面对这个方法的任何演员问题吗?

非常感谢

2 个答案:

答案 0 :(得分:4)

这个问题的答案是几乎总是“返回与源相同类型的对象”实际上并不与您的应用程序相关,并且您正在以错误的方式处理事情

如果您的调用者需要特定的List实现,因为他们将对其进行特定类型的操作,那么他们可以自己进行复制...但是如果您的方法采用类型的任意参数List,输出根据输入的确切实现在语义上发生变化,那就是巨大的代码味道。

保持代码不变,如果方法的调用者确实需要特定的实现,那么他们可以将输出复制到该实现中。

答案 1 :(得分:1)

你在这里有两个选择。

1:意识到接受List<T>接口作为输入类型意味着您明确表示您并不关心底层实现。此外,通过返回List<T>,它表示您的调用者也不应该关心底层实现。在大多数情况下,ListList,细节不重要。如果是,则应明确返回ArrayList<T>

2:进行一系列与您要支持的每个List实现类型匹配的多态调用。

我非常认为第一个答案是你应该指导你的努力。