tipos primitivos objeto ejemplos definicion datos java generics autoboxing

objeto - Java: matriz de tipos de datos primitivos no autobox



tipos de variables en java ejemplos (10)

Tengo un método como este:

public static <T> boolean isMemberOf(T item, T[] set) { for (T t : set) { if (t.equals(item)) { return true; } } return false; }

Ahora trato de llamar a este método usando un char para T :

char ch = ''a''; char[] chars = new char[] { ''a'', ''b'', ''c'' }; boolean member = isMemberOf(ch, chars);

Esto no funciona Esperaría que el char y char[] se autoboxen a Character y Character[] , pero eso no parece suceder.

¿Alguna idea?


¿Por qué sería char[] encerrado en Character[] ? Las matrices son siempre tipos de referencia, por lo que no se requiere boxeo.

Además, sería horriblemente caro: implicaría crear una nueva matriz y luego encajonar cada char por turno. ¡Ay!


Como otros han mencionado, no hay autoboxing para matrices de primitivas. Si desea utilizar su método con matrices primitivas, deberá proporcionar una sobrecarga para cada tipo primitivo. Esta parece ser la forma estándar de hacer las cosas en las bibliotecas de clase. Ver las sobrecargas en java.util.Arrays , por ejemplo.


Correcto, no hay autoboxing para arrays (lo que resulta en rarezas en casos como int[] ints; ...; Arrays.asList(ints) - asList devuelve una lista que contiene un solo objeto, ¡la matriz!)

Aquí hay una utilidad simple para boxear una matriz.

public static Integer[] boxedArray(int[] array) { Integer[] result = new Integer[array.length]; for (int i = 0; i < array.length; i++) result[i] = array[i]; return result; }

Necesitarás una versión diferente para cada tipo primitivo, por supuesto.


Esto parece ser por diseño, tanto para evitar una operación de autoboxing tan costosa, como porque los genéricos tienen que ser compatibles con el bytecode de Java existente.

Ver este artículo y este error , por ejemplo.


Ingrese Java 8 y deje que primArray sea ​​un identificador de tipo PrimType[] , luego puede hacer lo siguiente:
BoxedType[] boxedArray = IntStream.range(0, primArray.length).mapToObj(i -> primArray[i]).toArray(BoxedType[] :: new);


Las matrices son un tipo de implementación de bajo nivel. char[] será un área contigua de memoria con caracteres de dos bytes. Character[] será un área contigua de memoria con referencias de cuatro u ocho bytes. No puede obtener un Character[] para ajustar un carácter []. Sin embargo, un List<Character> podría envolver un char[] .

Normalmente, las matrices de referencias no son una buena idea a menos que esté escribiendo un código de bajo nivel. Si lo desea, puede escribir u obtener un equivalente de java.util.Arrays.asList .


No hay autoboxing para arrays, solo para primitivos. Creo que este es tu problema


Podría usar la reflexión para obtener un método que funcione para todos los tipos de matrices, pero perdería seguridad de tipo, por lo que probablemente no sea lo que quiere.

import java.lang.reflect.Array public static boolean isMemberOfArray(Object item, Object array) { int n = Array.getLength(array) for (int i = 0; i < n; i++) { if (Array.get(array, i).equals(item)) { return true; } } return false; }


Primero, trataría de evitar las matrices tanto como sea posible, use listas en su lugar.

No hay autoboxing para arrays, pero hay autoboxing para varargs. Entonces, si declaras tu método como (con el mismo cuerpo):

public static <T> boolean isMemberOf(T item, T ... set)

entonces puedes escribir

isMemberOf(''a'', ''a'', ''b'', ''c'');

Personalmente, prefiero usar la guayaba de google, donde puedes escribir cosas como

char ch = ''a''; char[] chars = new char[] { ''a'', ''b'', ''c'' }; boolean member = isMemberOf(ch, Chars.asList(chars).toArray(new Character[0]));

Su código probablemente sea solo un ejemplo, pero si realmente desea probar la membresía, puede hacerlo así:

Chars.contains(chars, ch); or ImmutableSet.of(''a'', ''b'', ''c'').contains(''a'')


Una forma más simple de hacer esto es

char ch = ''a''; String chars = "abc"; boolean member = chars.indexOf(ch) >= 0;