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!
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()
).
Pas besoin de réussir la classe:
public <T> List<T> magicalListGetter() {
return new ArrayList<T>();
}
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);
`
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;
}
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.
Quelque chose comme ça
publiс <T> List<T> magicalListGetter(Class<T> clazz) {
List list = doMagicalVooDooHere();
return list;
}
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;
}