with values objects instantiated initialize cannot java list initialization

java - values - ¿Inicializando la lista<T> con un número dado de nulos sin bucle?



list string string java (9)

Lo que hice fue

MyClass[] array = {new MyClass(), new MyClass(), new MyClass(), new MyClass(), new ProfileSectionDTO(), new MyClass()}; List<MyClass> MyClassList = Arrays.asList(array);

Sucio, pero trabajando :)

¿Se puede inicializar una List<T> para que contenga un número dado de null s, donde T es un parámetro de tipo de la clase de la que la lista es miembro? Claro que puedo hacerlo con un bucle, pero me gustaría saber si es posible sin él.

List<T> myList = new ArrayList<T>(numEls);

crea una lista de la capacidad dada, pero el tamaño 0, por lo que myList.get(x) falla para todas las x , y también lo hace, por ejemplo, myList.set(numEls-1,null) .

myList = Arrays.asList(new T[numEls]);

no compila, y

myList = (List<T>) Arrays.asList(new Object[numEls]);

se compila en Eclipse (con una advertencia de lanzamiento sin marcar), pero no con javac.

Actualización: ¡ Gracias por las respuestas! Sin embargo, encontré otra solución, bastante breve, cercana a mi último intento anterior, que compila tanto en eclipse como con nuestro sistema de compilación automatizado: ¡ Convierta la matriz, no la lista!

myList = Arrays.asList((T[]) new Object[numEls]);


Lo que probablemente quieras es algo como esto ...

final int maxSize = 50; List<T> v = new Vector<T>() {{setSize(maxSize);}};

Los vectores le permiten establecer un tamaño, que los llena con null .


Necesitaría usar la reflexión para crear una instancia de una matriz de respaldo T[] usando Array.newInstance() :

public static <T> List<T> getListWithNulls(Class<T> componentType, int length) { T[] array = (T[])Array.newInstance(componentType, length); return new ArrayList<T>(Arrays.asList(array)); }

Como puede ver, esto requiere una referencia al objeto Class<T> que representa el tipo de T :

List<String> strListWithNulls = getListWithNulls(String.class, 100);

También asegúrese de no confundir las clases java.lang.reflect.Array y java.util.Arrays que se utilizan aquí.

Finalmente, tenga en cuenta que la reflexión va a ser mucho más lenta que solo usar un bucle.


No es realmente una solución, pero quería evitar un bucle.

void fillNullList(List<T> list, count) { if (count > 0) { list.add(null); fillNullList(list, count - 1); } }

En serio, ¿por qué quieres evitar un bucle? Probablemente, desea una solución con complejidad O (1) y no una solución con complejidad O (n) independientemente de si se utiliza un bucle para no.


Nueva opción con streams:

Lista resultColumn = IntStream.range (0, 10000) .mapToObj (i -> null) .collect (Collectors.toList ());


Prueba esto:

List<String> list = new ArrayList<String>(Arrays.asList(new String[100])); for(String string : list){ System.out.println(string); }

Bueno, puedes escribir una jerarquía:

class Base<T>{ protected List<T> list; public List<T> getList(){ return list; } } class Child extends Base<String>{ public Child(){ list = new ArrayList<String>(Arrays.asList(new String[100])); } }

Se puede utilizar de la siguiente manera:

Base<String> base = new Child(); base.getList();


Si no necesitas mutar la lista ...

List<T> result = Collections.nCopies(num, (T) null);

... o alternativamente

List<T> result = new ArrayList<T>(Collections.nCopies(num, (T) null));


Si quieres un ArrayList puedes usar la reflexión para hacer trampa

ArrayList<T> myList = new ArrayList<T>(numEls); Field f = ArrayList.class.getField("size");//cache this f.setAccessible(true); f.setInt(myList, numEls);


Yo solo usaría un bucle, es más simple y es probable que también sea más rápido.

List<T> list = while(list.size()<size) list.add(null);

Cualquier otro enfoque que utilice es probable que use un bucle para usted. Si esto está bien, simplemente escriba su propio método que oculta el bucle utilizado.