Frage

Ich habe eine Methode wie folgt:

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

Jetzt versuche ich, zum Aufrufen dieser Methode eine char für T mit:

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

Das funktioniert nicht. Ich würde die char und char[] erwarten zu erhalten autoboxed Character und Character[], aber das scheint nicht zu passieren.

Keine Erkenntnisse?

War es hilfreich?

Lösung

Es gibt keine Autoboxing für Arrays, nur für Primitive. Ich glaube, das ist Ihr Problem.

Andere Tipps

Warum würde char[] boxed Character[]? Arrays sind immer Referenztypen, so dass keine Boxen erforderlich ist.

Darüber hinaus wäre es schrecklich teuer sein - es würde bedeuten, ein neues Array erstellen und dann jedes Zeichen wiederum Boxen. Huch!

könnten Sie verwenden Reflexion ein Verfahren zu erhalten, die für alle Arten von Arrays funktioniert, aber Sie würde Art Sicherheit verlieren, so ist dies wahrscheinlich nicht das, was Sie wollen.

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

Richtig, es gibt keine Autoboxing für Arrays ist (die in Fällen wie int[] ints; ...; Arrays.asList(ints) in Seltsamkeit führt - asList gibt eine Liste ein einzelnes Objekt enthält, das Array)

Hier ist ein einfaches Programm, um ein Array boxen.

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

Sie werden für jeden primitiven Typen, natürlich eine andere Version benötigen.

Das ist von Entwurf zu sein scheint, die beide einen so teuren Autoboxing Betrieb zu vermeiden, und weil Generika hat mit dem vorhandenen Java-Bytecode rückwärtskompatibel sein.

Siehe diesem Artikel und dieser Fehler , zum Beispiel.

Arrays sind eine Low-Level-Implementierung Art der Sache. char[] wird ein zusammenhängender Bereich des Speichers mit zwei-Byte-Zeichen sein. Character[] wird ein zusammenhängender Bereich des Speichers mit vier oder acht-Byte-Referenzen sein. Sie können keine Character[] wickeln ein char [] erhalten. Doch eine List<Character> könnte eine char[] wickeln.

Arrays von Referenzen ist nicht in der Regel eine gute Idee, es sei denn, Sie Low-Level-Code schreiben. Sie könnten, wenn Sie es wünschen, schreiben oder ein Äquivalent von java.util.Arrays.asList erhalten.

Wie andere erwähnt haben, gibt es kein Autoboxing für Arrays von Primitiven. Wenn Sie Ihre Methode verwenden, mit primitiven Arrays wollen, müssen Sie eine Überlastung für jede primitive Art zu schaffen. Dies scheint der normale Weg, Dinge zu tun, in den Klassenbibliotheken zu sein. Siehe die Überlastungen in java.util.Arrays , zum Beispiel.

Als erstes würde ich versuchen Arrays so viel zu vermeiden, wie Sie können, verwenden Listen statt.

Es gibt keine Autoboxing für Arrays, aber es ist für Autoboxing varargs. Also, wenn Sie erklären, um Ihre Methode als (mit dem gleichen Körper):

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

, dann können Sie schreiben

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

Ich persönlich lieber mit Googles Guave, wo man Dinge wie

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

Der Code war wahrscheinlich nur ein Beispiel, aber wenn man wirklich wollte Mitgliedschaft testen, in Sie es wie folgt tun:

Chars.contains(chars, ch);

or

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

Geben Sie Java 8 und lassen primArray eine Kennung vom Typ PrimType[] sein, dann Sie können wie folgt vorgehen:
BoxedType[] boxedArray = IntStream.range(0, primArray.length).mapToObj(i -> primArray[i]).toArray(BoxedType[] :: new);

Ein einfacher Weg, dies zu tun ist,

char ch = 'a';
String chars = "abc";
boolean member = chars.indexOf(ch) >= 0;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top