【问题标题】:Java - A method that takes vararg and returns arraylist?Java - 一种采用可变参数并返回数组列表的方法?
【发布时间】:2016-12-26 07:56:41
【问题描述】:

我对泛型并不完全满意,因此还没有找到解决方案。我有这三种方法:

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

如何创建一个单一的方法,该方法采用 T(或其他)的可变参数并创建它的 ArrayList?

【问题讨论】:

    标签: java generics arraylist


    【解决方案1】:

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

    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);
         ...
    }
    

    【讨论】:

    • 谢谢,但我不想在使用时说明我传入的对象的类。
    • 我没有看到这种方法的任何优势 - 这如何“更好”?
    • @Hulk,Take a look at。 (确实可以将 VarArgsToList 视为实用程序,但我仍然更喜欢 Function 方法。只是我的看法)
    • 这样做的唯一好处是能够在测试时模拟这种行为,但这只有在您能够以某种方式从外部注入 VarArgsToList 时才有意义。如果实例是在调用站点显式创建的,则只会增加冗长性。
    【解决方案2】:

    只需用类型变量替换您的类型:

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

    请注意,您可以查看Arrays.asList 是如何声明的,因为从类型的角度来看,它的作用大致相同。

    【讨论】:

    • 谢谢!为了帮助我理解,为什么在签名中List&lt;T&gt; 之前需要&lt;T&gt;
    • 它声明了一个作用于该方法的类型变量。
    • 但我在List&lt;T&gt; 中有T?为什么我之前需要它?为什么我的原始方法签名中不需要&lt;ObjectA&gt; List&lt;ObjectA&gt;
    • 因为&lt;ObjectA&gt;是一个类型变量声明,所以List&lt;ObjectA&gt;指的是名字恰好是ObjectA的类型变量,而不是ObjectA类。
    猜你喜欢
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多