¿Cómo hacer que el método Java devuelva una lista genérica de cualquier tipo?

Me gustaría escribir un método que devuelva un java.util.List de cualquier tipo sin la necesidad de encasillar algo :

 List users = magicalListGetter(User.class); List vehicles = magicalListGetter(Vehicle.class); List strings = magicalListGetter(String.class); 

¿Cómo se vería la firma del método? Algo como esto, tal vez (?):

 public List< ?> magicalListGetter(Class clazz) { List list = doMagicalVooDooHere(); return list; } 

¡Gracias por adelantado!

 private Object actuallyT; public  List magicalListGetter(Class klazz) { List list = new ArrayList<>(); list.add(klazz.cast(actuallyT)); try { list.add(klazz.getConstructor().newInstance()); // If default constructor } ... return list; } 

También se puede dar un parámetro de tipo genérico a un método. Dedujo correctamente que necesita la instancia de clase correcta para crear cosas ( klazz.getConstructor().newInstance() ).

No es necesario pasar la clase:

 public  List magicalListGetter() { return new ArrayList(); } 

Otra opción es hacer lo siguiente:

 public class UserList extends List{ } public  T magicalListGetter(Class clazz) { List list = doMagicalVooDooHere(); return (T)list; } List users = magicalListGetter(UserList.class); 

`

Vamos a tener ListobjectList que queremos convertir a List

 public  List list(Class c, List objectList){ List list = new ArrayList<>(); for (Object o : objectList){ T t = c.cast(o); list.add(t); } return list; } 

Puedes usar la antigua manera:

 public List magicalListGetter() { List list = doMagicalVooDooHere(); return list; } 

o puede usar Object y la clase padre de todo:

 public List magicalListGetter() { List list = doMagicalVooDooHere(); return list; } 

Nota Quizás haya una mejor clase para todos los objetos que colocará en la lista. Por ejemplo, Number te permitiría poner Double y Integer allí.

Algo como esto

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

Simplemente puede convertir a List y luego verificar si cada elemento puede ser transferido a T.

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

Estoy bastante seguro de que puedes eliminar por completo el , lo que generará una advertencia y puedes usar un @supresión de advertencias. Si realmente quiere que sea genérico, pero para usar cualquiera de sus elementos, tendrá que hacer el tipo de conversión. Por ejemplo, hice una función de clasificación de burbujas simple y usa un tipo genérico al ordenar la lista, que en realidad es una matriz de Comparable en este caso. Si desea utilizar un elemento, haga algo como: System.out.println ((Double) arrayOfDoubles [0] + (Double) arrayOfDoubles [1]); porque metí Doble (s) en Comparable (s) que es polymorphism ya que todas las Doble (s) heredan de Comparable para permitir una fácil clasificación a través de 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)