2016-08-19 90 views
7

Nie jestem całkowicie zadowolony z generycznych i tym samym nie znalazłem jeszcze rozwiązania. Mam te trzy metody:Java - Metoda, która pobiera vararg i zwraca listę tablic?

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

Jak mogę utworzyć jedną metodę, która pobiera vararg z T (lub coś) i tworzy ArrayList z tego?

Odpowiedz

10

Wystarczy zastąpić typ ze zmienną typu:

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

Zauważ, że można spojrzeć na to, jak Arrays.asList została zadeklarowana, ponieważ w dużej mierze robi to samo, z punktu widzenia typu.

+0

dzięki! Aby pomóc mi zrozumieć, dlaczego potrzebuję '' przed 'List ' w podpis? – DoeMoeJoe

+0

Deklaruje zmienną typu o tej samej skali. –

+0

Ale mam 'T' w' List '? Dlaczego potrzebuję tego wcześniej? Dlaczego nie potrzebuję ' List ' w moim oryginalnym sygnaturze metody? – DoeMoeJoe

0

Myślę, że funkcja jest lepszym podejściem niż metoda statyczna. Można zdefiniować funkcję:

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

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

i stosować go wszędzie:

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

Dzięki, ale nie chcę podawać klasy obiektów, które mijam, kiedy go używam. – DoeMoeJoe

+1

Nie widzę żadnej korzyści z tego podejścia - jak to jest "lepsze"? – Hulk

+0

@Hulk, [Spójrz na] (http://stackoverflow.com/questions/1530353/in-what-situations-is-static-method-a-good-praktice). (Prawdą jest, że można rozważyć VarArgsToList jako narzędzie, ale ja nadal wolę podejście Function.Tylko moja opinia) – debus