Pregunta

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 con un char para T:

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

Esto no funciona.Yo esperaría que la char y char[] para obtener autoboxed a Character y Character[], pero que no parece pasar.

Cualquier conocimiento?

¿Fue útil?

Solución

No hay autoboxing para las matrices, sólo para primitivas. Creo que este es su problema.

Otros consejos

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

Además, sería terriblemente caro - que implicaría la creación de una nueva matriz y luego el boxeo cada caracter en turno. Uff!

Se puede utilizar la reflexión para obtener un método que funciona para todo tipo de matrices, pero se perdería la seguridad de tipos, por lo que probablemente no es lo que desea.

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

correcta, no hay autoboxing para las matrices (que da lugar a la rareza en casos como int[] ints; ...; Arrays.asList(ints) - asList devuelve una lista que contiene un único objeto, la matriz)

Esto es una sencilla utilidad a la caja de 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;
}

Se necesita una versión diferente para cada tipo primitivo, por supuesto.

Esto parece ser por diseño, tanto para evitar una operación autoboxing tan caro, y debido a los genéricos tienen que ser compatible hacia atrás con el código de bytes de Java existente.

este artículo y este error, por ejemplo.

Las matrices son un tipo de implementación de bajo nivel de cosas. char[] habrá un área contigua de memoria con caracteres de dos bytes. Character[] habrá un área contigua de memoria con referencias de cuatro o de ocho bytes. No se puede conseguir un List<Character> para envolver un char []. Sin embargo, un java.util.Arrays.asList podría envolver un <=>.

Las matrices de referencias no son generalmente una buena idea a menos que usted está escribiendo código de bajo nivel. Se podría, si lo desea, escribir u obtener un equivalente de <=>.

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

En primer lugar, me gustaría tratar de evitar matrices como todo lo que pueda, utilizar listas en su lugar.

No hay autoboxing para las matrices, pero hay autoboxing para varargs. Así que si usted declara su método (en la misma entidad):

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

A continuación, se puede escribir

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

En lo personal, yo prefiero usar la guayaba de Google, donde puede 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 era probablemente sólo un ejemplo, pero si realmente quería probar la integración, de que puede hacerlo de esta manera:

Chars.contains(chars, ch);

or

ImmutableSet.of('a', 'b', 'c').contains('a')

Introduzca Java 8 y dejar primArray ser un identificador de tipo PrimType[], entonces puede hacer lo siguiente:
BoxedType[] boxedArray = IntStream.range(0, primArray.length).mapToObj(i -> primArray[i]).toArray(BoxedType[] :: new);

Una forma más sencilla de hacer esto es

char ch = 'a';
String chars = "abc";
boolean member = chars.indexOf(ch) >= 0;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top