【问题标题】:How to have Java method return generic list of any type?如何让 Java 方法返回任何类型的通用列表?
【发布时间】: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;()

标签: java list generics reflection casting


【解决方案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)
            

            【讨论】:

              猜你喜欢
              • 2010-10-01
              • 2012-04-06
              • 2020-11-22
              • 2016-12-02
              • 2010-12-19
              • 1970-01-01
              • 1970-01-01
              • 2012-07-11
              • 1970-01-01
              相关资源
              最近更新 更多