web-dev-qa-db-ja.com

Javaメソッドがあらゆるタイプのジェネリックリストを返すようにする方法は?

任意のタイプのJava.util.Listを返すメソッドを記述したいと思います何もタイプキャストする必要なし

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

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

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

メソッドのシグネチャはどのようになりますか?このようなもの、おそらく(?):

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

    return list;
}

前もって感謝します!

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

メソッドにジェネリック型パラメーターを与えることもできます。物を作成するには、正しいクラスインスタンスが必要であると正しく推測できました(klazz.getConstructor().newInstance())。

116
Joop Eggen

クラスを渡す必要さえありません:

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

別のオプションでは、次のことを行います。

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

List<Object> objectListをキャストして、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

古い方法を使用できます:

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

    return list;
}

または、Objectとすべての親クラスを使用できます。

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

    return list;
}

おそらく、リストに入れるすべてのオブジェクトに対して、より良い親クラスがあります。たとえば、Numberを使用すると、DoubleIntegerをそこに配置できます。

1
Lee Meador

このようなもの

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

Listにキャストしてから、すべての要素を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