如何让 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&lt;&gt;() 【参考方案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&lt;Object&gt; objectList 转换为List&lt;T&gt;

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 将允许您将 DoubleInteger 放在那里。

【讨论】:

【参考方案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】:

我很确定你可以完全删除 ,这会产生一个警告,你可以使用 @suppress 警告。如果你真的希望它是通用的,但要使用它的任何元素,你将不得不进行类型转换。例如,我做了一个简单的冒泡排序函数,它在对列表进行排序时使用泛型类型,在这种情况下实际上是一个 Comparable 数组。如果您想使用某个项目,请执行以下操作: System.out.println((Double)arrayOfDoubles[0] + (Double)arrayOfDoubles[1]);因为我将 Double(s) 填充到 Comparable(s) 中,这是多态性,因为所有 Double(s) 都继承自 Comparable 以允许通过 Collections.sort() 轻松排序

        //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 方法返回任何类型的通用列表?的主要内容,如果未能解决你的问题,请参考以下文章

返回一个通用的 IEnumerable<T>

java - 通用返回类型? [复制]

返回列表的通用方法[关闭]

返回未知的通用列表<T>

Go 编程语言中的任何类型和实现通用列表

通过它的通用类型获取组件