任意のタイプの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;
}
前もって感謝します!
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()
)。
クラスを渡す必要さえありません:
public <T> List<T> magicalListGetter() {
return new ArrayList<T>();
}
別のオプションでは、次のことを行います。
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);
`
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;
}
古い方法を使用できます:
public List magicalListGetter() {
List list = doMagicalVooDooHere();
return list;
}
または、Object
とすべての親クラスを使用できます。
public List<Object> magicalListGetter() {
List<Object> list = doMagicalVooDooHere();
return list;
}
注おそらく、リストに入れるすべてのオブジェクトに対して、より良い親クラスがあります。たとえば、Number
を使用すると、Double
とInteger
をそこに配置できます。
このようなもの
publiс <T> List<T> magicalListGetter(Class<T> clazz) {
List list = doMagicalVooDooHere();
return list;
}
Listにキャストしてから、すべての要素をTにキャストできるかどうかを確認できます。
public <T> List<T> asList(final Class<T> clazz) {
List<T> values = (List<T>) this.value;
values.forEach(clazz::cast);
return values;
}