Colección de Java Tipo de parámetro a la matriz

KimchiMan:

Quiero crear un método de ayuda que recibe Collectionparámetro de tipo para devolver una lista. Esto es lo que tengo ahora:

public class Helper {
    public static <T> T[] CollectionToArray(Collection<T> collection) {
        return collection.stream().toArray(Object[]::new); // Error
    }

    public static <T> T[] ListToArray(List<T> list) {
        return list.stream().toArray(Object[]::new); // Error
    }
}

public class IamSoNoob {
    public void PleaseHelpMe() {

        List<String> list = new ArrayList<>();
        Set<String> set = new HashSet<>();

        String[] arrayFromList = Helper.CollectionToArray(list); // Error
        String[] arrayFromSet = Helper.CollectionToArray(set); // Error

        String[] array = Helper.ListToArray(list); // Error
    }
}

Mis preguntas son:

  1. ¿Es posible completar CollectionToArray(Collection<T>)?
    • ¿Si es así, cómo?
    • Además, es posible pasar Listy Setcomo un parámetro en el primer lugar?
  2. ¿Es posible completar ListToArray(List<T> list)?
    • ¿Si es así, cómo?

Pero aquí hay algunas restricciones debido a mi gusto personal.

  1. No quiero usar @SuppressWarnings
  2. Realmente quiero mantener la parte .stream().toArray(Object[]::new)(Java 8 parte!)

Y tengo la sensación de que tengo que arreglar la parte Object[]::newmediante el uso de algo así como: <T extends Object>o <? extends T>pero no puedo averiguar.

Por favor, ayúdame a salir, y por favor, dar una explicación, así, a menudo me confundo Genericy ?.

Ryotsu:

No, usted no puede hacerlo, si fuera posible, el método de biblioteca Collection.toArray()te habría dado el mismo tipo que el LHS pero en cambio cuando se desea que el tipo exacto como sus LHS tiene que usar Collection.toArray(T[])(aun que viene con ArrayStoreExceptionses decir, es de hasta al programador para proporcionar el tipo correcto de la matriz), la razón es que en tu toArray()has especificado Object[]para ser su matriz y después no puede echarlo a cualquier otro tipo o de lo contrario resultará en una ClassCastException.

La razón de todo esto alboroto es debido a la forma de genéricos obras es decir, su cosa un tiempo de compilación y en tiempo de ejecución de Java borra todos los parámetros de tipo a sus tipos de límite superior y por lo tanto la pérdida de información de tipo que se requiere para la creación de matrices.

Una forma segura de hacerlo es mediante la adición de otro parametro a usted como ayudante método

public static <T> T[] CollectionToArray(Collection<T> collection, T[] arr) {

            return collection.stream().toArray(value ->Arrays.copyOf(arr,collection.size()));


        }

y que sirva como

String[] arrayFromList = Helper.CollectionToArray(list, new String[0]);

pero de entonces todo el mundo mejor de usar Collection#toArray(T[]).

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=236181&siteId=1
Recomendado
Clasificación