web-dev-qa-db-fra.com

Comment avoir Java renvoie une liste générique de tout type?

J'aimerais écrire une méthode qui retournerait un Java.util.List de tout type sans besoin de transtypage:

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

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

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

À quoi ressemblerait la signature de la méthode? Quelque chose comme ça, peut-être (?):

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

    return list;
}

Merci d'avance!

60
user1768830
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;
}

On peut aussi donner un paramètre de type générique à une méthode. Vous avez correctement déduit qu'il faut l'instance de classe correcte pour créer des objets (klazz.getConstructor().newInstance()).

116
Joop Eggen

Pas besoin de réussir la classe:

public <T> List<T> magicalListGetter() {
    return new ArrayList<T>();
}
20
newacct

Une autre option est la suivante:

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
Aidamina

Laissez-nous List<Object> objectList que nous voulons lancer sur 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;
}
2
Oleg Mikhailov

Vous pouvez utiliser l'ancienne méthode:

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

    return list;
}

ou vous pouvez utiliser Object et la classe parente de tout:

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

    return list;
}

Note Peut-être existe-t-il une meilleure classe parente pour tous les objets que vous placerez dans la liste. Par exemple, Number vous permettrait de mettre Double et Integer ici.

1
Lee Meador

Quelque chose comme ça

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

Vous pouvez simplement transtyper en liste, puis vérifier si chaque élément peut être transtypé en T.

public <T> List<T> asList(final Class<T> clazz) {
    List<T> values = (List<T>) this.value;
    values.forEach(clazz::cast);
    return values;
}
0
K. Gol