Question

J'ai une méthode comme ceci:

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

Maintenant, je tente d'appeler cette méthode en utilisant un pour char T:

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

Cela ne fonctionne pas. Je me attends et char[] pour s'autoboxed Character à et Character[] <=>, mais cela ne semble pas se produire.

Les idées?

Était-ce utile?

La solution

Il n'y a pas autoboxing pour les tableaux, uniquement pour les primitives. Je crois que c'est votre problème.

Autres conseils

Pourquoi serait-être acculé à char[] Character[]? Les tableaux sont toujours types de référence, donc pas de la boxe est nécessaire.

En outre, il serait affreusement cher - il impliquerait la création d'un nouveau tableau, puis la boxe chaque omble chevalier à son tour. Aïe!

Vous pouvez utiliser la réflexion pour obtenir une méthode qui fonctionne pour tous les types de tableaux, mais vous perdez la sécurité de type, c'est donc probablement pas ce que vous voulez.

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

Corriger, il n'y a pas autoboxing pour les tableaux (qui se traduit par bizarreries dans des cas comme int[] ints; ...; Arrays.asList(ints) - asList retourne une liste contenant un seul objet, le tableau)

Voici un utilitaire simple à la boîte un tableau.

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

Vous aurez besoin d'une version différente pour chaque type primitif, bien sûr.

Cela semble être par la conception, à la fois pour éviter une telle opération de autoboxing coûteux, et parce que les médicaments génériques doivent être rétro-compatible avec le Java existant bytecode.

Voir cet article et ce bogue , par exemple.

Les tableaux sont un type de chose mise en œuvre à faible niveau. char[] aura une zone contiguë de la mémoire de caractères de deux octets. Sera une Character[] zone contiguë de mémoire avec quatre ou huit références octets. Vous ne pouvez pas obtenir un pour envelopper un List<Character> char []. Toutefois, un pourrait envelopper un java.util.Arrays.asList <=>.

Les tableaux de références ne sont généralement pas une bonne idée à moins que vous écrivez code de bas niveau. Vous pouvez, si vous le souhaitez, écrire ou obtenir un équivalent de <=>.

Comme d'autres l'ont mentionné, il n'y a pas autoboxing pour les tableaux de primitives. Si vous souhaitez utiliser votre méthode avec des tableaux primitifs, vous devrez fournir une surcharge pour chaque type primitif. Cela semble être la façon habituelle de faire les choses dans les bibliothèques de classes. Voir les surcharges java.util.Arrays , par exemple.

D'abord, je voudrais essayer d'éviter des tableaux comme autant que vous pouvez, utiliser des listes à la place.

Il n'y a pas autoboxing pour les tableaux, mais il est Autoboxing pour varargs. Donc, si vous déclarez votre méthode comme (avec le même corps):

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

vous pouvez écrire

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

Personnellement, je préfère utiliser la goyave de Google, où vous pouvez écrire des choses comme

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

Votre code était probablement juste un exemple, mais si vous voulez vraiment tester l'adhésion, en vous pouvez le faire comme ceci:

Chars.contains(chars, ch);

or

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

Entrez Java 8 et laisser être un identifiant primArray de type PrimType[], alors vous peut procédez comme suit:
BoxedType[] boxedArray = IntStream.range(0, primArray.length).mapToObj(i -> primArray[i]).toArray(BoxedType[] :: new);

A c'est une façon de faire plus simple

char ch = 'a';
String chars = "abc";
boolean member = chars.indexOf(ch) >= 0;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top