2016-08-19 63 views
7

我对泛型不太满意,因此还没有找到解决方案。我有以下三种方法:Java - 使用可变参数并返回数组列表的方法?

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?

回答

10

只是一个类型的变量替换您类型:

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

需要注意的是,你可以看看如何Arrays.asList声明,因为它在很大程度上同样的事情,从类型的角度。

+0

谢谢!为了帮助我理解,为什么我需要签名中的'List '之前的''? – DoeMoeJoe

+0

它声明一个类型变量作用域为该方法。 –

+0

但是我在'List '中有'T'?为什么我之前需要它?为什么我不需要'列表'在我的原始方法签名? – DoeMoeJoe

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

谢谢,但我不想在我使用它时传递的对象的类。 – DoeMoeJoe

+1

我没有看到这种方法的优势 - 这是如何“更好”? – Hulk

+0

@浩克,[看看](http://stackoverflow.com/questions/1530353/in-what-situations-is-static-method-a-good-practice)。 (的确,您可以将VarArgsToList视为实用工具,但我仍然更喜欢函数方法,只是我的看法) – debus