it-swarm.com.de

Wie soll die Java -Methode eine generische Liste eines beliebigen Typs zurückgeben?

Ich möchte eine Methode schreiben, die ein Java.util.List von jedem Typ ohne dass irgendetwas typisiert werden muss:

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

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

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

Wie würde die Methodensignatur aussehen? So etwas vielleicht (?):

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

    return list;
}

Danke im Voraus!

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

Man kann einer Methode auch einen generischen Typparameter geben. Sie haben richtig abgeleitet, dass man die richtige Klasseninstanz benötigt, um Dinge zu erstellen (klazz.getConstructor().newInstance()).

116
Joop Eggen

Keine Notwendigkeit, die Klasse zu bestehen:

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

Eine andere Option ist das Folgende:

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

Lass uns haben List<Object> objectList den wir besetzen wollen 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

Sie können den alten Weg verwenden:

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

    return list;
}

oder Sie können Object und die übergeordnete Klasse von allem verwenden:

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

    return list;
}

Anmerkung Vielleicht gibt es für alle Objekte, die Sie in die Liste aufnehmen, eine bessere Elternklasse. Mit Number können Sie beispielsweise Double und Integer eingeben.

1
Lee Meador

Etwas wie das

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

Sie können einfach in Liste umwandeln und dann überprüfen, ob jedes Element in T umwandelbar ist.

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