2013-07-24 13 views
43

chciałbym napisać metodę, która zwróci java.util.List dowolnego typu bez konieczności typecast nic:Jak uzyskać metodę Java zwracającą listę rodzajową dowolnego typu?

List<User> users = magicalListGetter(User.class); 

List<Vehicle> vehicles = magicalListGetter(Vehicle.class); 

List<String> strings = magicalListGetter(String.class); 

Co podpis metoda wygląda? Coś takiego może (?):

public List<<?> ?> magicalListGetter(Class<?> clazz) { 
    List<?> list = doMagicalVooDooHere(); 

    return list; 
} 

Z góry dziękuję!

+2

Chcesz lista być wypełniane poprzez odbicie? W przeciwnym razie użyj po prostu 'new ArrayList <>()'. –

Odpowiedz

83
private Object actuallyT; 

public <T> List<T> magicalListGetter(Class<T> klazz) { 
    List<T> list = new ArrayList<>(); 
    list.add(klazz.cast(actuallyT)); 
    try { 
     list.add(klazz.getConstructor().newInstance()); // If default constructor 
    } ... 
    return list; 
} 

Można również podać rodzajowy parametr dla metody. Prawidłowo wydedukowałeś, że potrzebna jest poprawna instancja klasy, aby tworzyć rzeczy (klazz.getConstructor().newInstance()).

1

Można użyć stary sposób:

public List magicalListGetter() { 
    List list = doMagicalVooDooHere(); 

    return list; 
} 

lub użyć Object a klasa dominująca wszystko:

public List<Object> magicalListGetter() { 
    List<Object> list = doMagicalVooDooHere(); 

    return list; 
} 

Note Może istnieje lepsza klasa nadrzędna dla wszystkich obiekty, które umieścisz na liście. Na przykład: Number pozwoli ci umieścić tam Double i Integer.

1

coś takiego

publiс <T> List<T> magicalListGetter(Class<T> clazz) { 
    List list = doMagicalVooDooHere(); 
    return list; 
} 
+1

po co przechodzić 'clazz', jeśli nie zamierzasz go użyć? – newacct

+1

to było tak w pytaniu, prawdopodobnie OP będzie go używał jakoś –

-1

Jestem całkiem pewien, że można całkowicie usunąć <rzeczy>, która będzie generować ostrzeżenia i można użyć @ stłumić ostrzeżenia. Jeśli naprawdę chcesz, aby był ogólny, ale używał któregokolwiek z jego elementów, musisz wykonać rzutowanie typu. Na przykład, stworzyłem prostą funkcję sortowania bąbelkowego i podczas sortowania listy używana jest nazwa rodzajowa, która w tym przypadku jest w rzeczywistości Tablicą Porównywalnych. Jeśli chcesz użyć przedmiotu, wykonaj coś w stylu: System.out.println ((Double) arrayOfDoubles [0] + (Double) arrayOfDoubles [1]); bo nadziewane double (s) na porównywalne (s), który jest polimorfizm ponieważ wszystkie Jedynka (s) dziedziczą Porównywalne aby umożliwić łatwe sortowanie poprzez Collections.sort()

 //INDENT TO DISPLAY CODE ON STACK-OVERFLOW 
@SuppressWarnings("unchecked") 
public static void simpleBubbleSort_ascending(@SuppressWarnings("rawtypes") Comparable[] arrayOfDoubles) 
{ 
//VARS 
    //looping 
    int end  =  arrayOfDoubles.length - 1;//the last index in our loops 
    int iterationsMax = arrayOfDoubles.length - 1; 

    //swapping 
    @SuppressWarnings("rawtypes") 
    Comparable tempSwap = 0.0;//a temporary double used in the swap process 
    int elementP1 = 1;//element + 1, an index for comparing and swapping 


//CODE 
    //do up to 'iterationsMax' many iterations 
    for (int iteration = 0; iteration < iterationsMax; iteration++) 
    { 
     //go through each element and compare it to the next element 
     for (int element = 0; element < end; element++) 
     { 
      elementP1 = element + 1; 

      //if the elements need to be swapped, swap them 
      if (arrayOfDoubles[element].compareTo(arrayOfDoubles[elementP1])==1) 
      { 
       //swap 
       tempSwap = arrayOfDoubles[element]; 
       arrayOfDoubles[element] = arrayOfDoubles[elementP1]; 
       arrayOfDoubles[elementP1] = tempSwap; 
      } 
     } 
    } 
}//END public static void simpleBubbleSort_ascending(double[] arrayOfDoubles) 
16

Nie trzeba nawet przechodzić klasę:

public <T> List<T> magicalListGetter() { 
    return new ArrayList<T>(); 
} 
+2

Myślę, że musisz przekazać klasę, gdy chcesz dodać przedmioty. – zygimantus

1

Innym rozwiązaniem jest wykonanie następujących czynności:

public class UserList extends List<User>{ 

} 

public <T> T magicalListGetter(Class<T> clazz) { 
    List<?> list = doMagicalVooDooHere(); 
    return (T)list; 
} 

List<User> users = magicalListGetter(UserList.class); 

`

2

Miejmy List<Object> objectList który chcemy oddać do List<T>

public <T> List<T> list(Class<T> c, List<Object> objectList){   
    List<T> list = new ArrayList<>();  
    for (Object o : objectList){ 
     T t = c.cast(o); 
     list.add(t); 
    } 
    return list; 
} 
0

można po prostu oddanych do listy, a następnie sprawdzić, czy każdy element może być lanego do T.

public <T> List<T> asList(final Class<T> clazz) { 
    List<T> values = (List<T>) this.value; 
    values.forEach(clazz::cast); 
    return values; 
} 
Powiązane problemy