如何让Java方法返回任何types的generics列表?

我想写一个方法,将返回任何types的java.util.List而不需要任何types的注释

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

我们也可以给genericstypes参数。 您已经正确地推断出需要正确的类实例来创build事物( klazz.getConstructor().newInstance() )。

无需通过课堂:

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

让我们有List<Object> objectList我们想要投射到List<T> List<Object> objectList

 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可以让你把DoubleInteger放在那里。

像这样的东西

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

另一个select是做以下事情:

 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,然后检查每个元素是否可以被转换成T.

 public <T> List<T> asList(final Class<T> clazz) { List<T> values = (List<T>) this.value; values.forEach(clazz::cast); return values; } 

我敢肯定,你可以完全删除<stuff>,这将产生一个警告,你可以使用,@压制警告。 如果你真的希望它是通用的,但要使用它的任何元素,你将不得不做types转换。 例如,我做了一个简单的气泡sorting函数,并且在sorting列表时使用了一个genericstypes,在这种情况下实际上是一个Comparable数组。 如果你想使用一个项目,像这样:System.out.println((Double)arrayOfDoubles [0] +(Double)arrayOfDoubles [1]); 因为我将Double填入Comparable(s),这是多态性的,因为所有的Double都是从Comparableinheritance的,允许通过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)