Java - 一个接受可变参数并返回ArrayList的方法?

7

我对泛型不是很熟悉,因此还没有找到解决方法。我有这三个方法:

public static List<ObjectA> objectAAsList(ObjectA ... items) {
    return new ArrayList<>(Arrays.asList(items));
}

public static List<ObjectB> objectBAsList(ObjectB ... items) {
    return new ArrayList<>(Arrays.asList(items));
}

public static List<ObjectC> objectCAsList(ObjectC ... items) {
    return new ArrayList<>(Arrays.asList(items));
}

如何创建一个仅使用 vararg 的 T 类型参数的方法,并将其转换为 ArrayList?

2个回答

10

只需将您的类型替换为类型变量:

public static <T> List<T> genericAsList(T ... items) {
    return new ArrayList<>(Arrays.asList(items));
}

请注意,您可以查看Arrays.asList的声明方式,因为从类型角度来看,它执行的是大致相同的操作。


感谢您!为了帮助我理解,为什么在签名中的 List<T> 前面需要 <T> - DoeMoeJoe
它声明了一个类型变量,其作用域限定在该方法内。 - Andy Turner
但是我在 List<T> 中已经有了 T,为什么我需要在之前加上它呢?为什么我在原始方法签名中不需要 <ObjectA> List<ObjectA> 呢? - DoeMoeJoe
因为<ObjectA>是一个类型变量声明,所以List<ObjectA>指的是类型变量,其名称恰好为ObjectA,而不是类ObjectA - Andy Turner

0

我认为函数比静态方法更好。您可以定义一个函数:

public class VarArgsToList<T> implements Function<T[], List<T>> {

    @Override
    public List<T> apply(final T... items) {
        return new ArrayList<>(Arrays.asList(items));
    }
}

并在任何地方应用它:

public static void main(final String... arg) {
    ...
    final List<String> list1 = new VarArgsToList<String>().apply(arg);
    ...
    final List<MyObject> list2 = new VarArgsToList<MyObject>().apply(myObject1, myObject2, myObject3);
     ...
}

谢谢,但我不想在使用时声明传递的对象的类。 - DoeMoeJoe
1
我看不出这种方法有什么优势 - 这怎么会更好呢? - Hulk
@ Hulk,看一下。(虽然你可以将VarArgsToList视为实用工具,但我仍然更喜欢Function方法。只是我的个人意见) - debus
这样做的唯一优点是在测试时能够模拟这种行为,但只有在能够从外部注入VarArgsToList的情况下才相关。如果实例是在调用现场明确创建的,则除了冗长之外没有任何意义。 - Hulk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接