如何让 Java 方法返回任何类型的通用列表?
Posted
技术标签:
【中文标题】如何让 Java 方法返回任何类型的通用列表?【英文标题】:How to have Java method return generic list of any type? 【发布时间】:2013-07-24 17:03:21 【问题描述】:我想编写一个返回任何类型的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;
【问题讨论】:
您希望通过反射填充列表吗?否则只需使用new ArrayList<>()
。
【参考方案1】:
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()
)。
【讨论】:
【参考方案2】:甚至不需要通过课程:
public <T> List<T> magicalListGetter()
return new ArrayList<T>();
【讨论】:
我认为你想添加项目时需要通过一个类。 如果您想操作列表并简单地返回相同的类型,这是最好的解决方案。 (例如,颠倒顺序、减少项目数量等)只有在需要实例化 T 类型的新对象时才需要传递一个类。【参考方案3】:另一种选择是执行以下操作:
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);
`
【讨论】:
【参考方案4】:让我们将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;
【讨论】:
【参考方案5】:你可以使用旧方法:
public List magicalListGetter()
List list = doMagicalVooDooHere();
return list;
或者你可以使用Object
和一切的父类:
public List<Object> magicalListGetter()
List<Object> list = doMagicalVooDooHere();
return list;
注意 对于您将放在列表中的所有对象,也许有一个更好的父类。例如,Number
将允许您将 Double
和 Integer
放在那里。
【讨论】:
【参考方案6】:类似的东西
publiс <T> List<T> magicalListGetter(Class<T> clazz)
List list = doMagicalVooDooHere();
return list;
【讨论】:
如果你不打算使用它,为什么要传递clazz
?
问题中是这样的,可能OP会以某种方式使用它【参考方案7】:
您可以简单地转换为 List,然后检查是否每个元素都可以转换为 T。
public <T> List<T> asList(final Class<T> clazz)
List<T> values = (List<T>) this.value;
values.forEach(clazz::cast);
return values;
【讨论】:
【参考方案8】:我很确定你可以完全删除
//INDENT TO DISPLAY CODE ON STACK-OVERFLOW
@SuppressWarnings("unchecked")
public static void simpleBubbleSort_ascending(@SuppressWarnings("rawtypes") Comparable[] arrayOfDoubles)
//VARS
//looping
int end = arrayOfDoubles.length - 1;//the last index in our loops
int iterationsMax = arrayOfDoubles.length - 1;
//swapping
@SuppressWarnings("rawtypes")
Comparable tempSwap = 0.0;//a temporary double used in the swap process
int elementP1 = 1;//element + 1, an index for comparing and swapping
//CODE
//do up to 'iterationsMax' many iterations
for (int iteration = 0; iteration < iterationsMax; iteration++)
//go through each element and compare it to the next element
for (int element = 0; element < end; element++)
elementP1 = element + 1;
//if the elements need to be swapped, swap them
if (arrayOfDoubles[element].compareTo(arrayOfDoubles[elementP1])==1)
//swap
tempSwap = arrayOfDoubles[element];
arrayOfDoubles[element] = arrayOfDoubles[elementP1];
arrayOfDoubles[elementP1] = tempSwap;
//END public static void simpleBubbleSort_ascending(double[] arrayOfDoubles)
【讨论】:
以上是关于如何让 Java 方法返回任何类型的通用列表?的主要内容,如果未能解决你的问题,请参考以下文章