سؤال

ولدي طريقة مثل هذا:

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

والآن أحاول أن استدعاء هذا الأسلوب باستخدام char لT:

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

وهذا لا يعمل. أتوقع أن char وchar[] للحصول على autoboxed إلى Character وCharacter[]، ولكن هذا لا يبدو أن يحدث.

وأي أفكار؟

هل كانت مفيدة؟

المحلول

وليس هناك autoboxing للصفائف، فقط لالأوليات. أعتقد أن هذا هو مشكلتك.

نصائح أخرى

وماذا char[] أن محاصر لCharacter[]؟ صفائف <م> دائما أنواع المراجع، بحيث لا يلزم الملاكمة.

وعلاوة على ذلك، سيكون مكلفا بشكل مخيف - أنه ينطوي على خلق مجموعة جديدة ثم الملاكمة كل حرف على حدة. ييكيس!

هل يمكن استخدام انعكاس للحصول على الطريقة التي يعمل لجميع أنواع المصفوفات، ولكنك ستفقد سلامة نوع، لذلك هذا هو على الارجح وليس ما تريد.

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

وصحيح، ليس هناك autoboxing للصفائف (مما يؤدي إلى غرابة في حالات مثل int[] ints; ...; Arrays.asList(ints) - asList بإرجاع قائمة تحتوي على كائن واحد، ومجموعة)

وهنا أداة بسيطة لمربع صفيف.

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

وسوف تحتاج إلى إصدار مختلف لكل نوع بدائي، بطبيعة الحال.

ويبدو أن هذا التصميم، وذلك لتجنب مثل هذه العملية autoboxing مكلفة، ولأن الأدوية يجب أن تكون إلى الوراء متوافقة مع بايت كود جافا القائمة.

هذه المقالة و <لأ href = "HTTP: //bugs.sun. كوم / bugdatabase / view_bug.do؟ bug_id = 4487555 "يختلط =" نوفولو noreferrer "> هذا الخطأ ، على سبيل المثال.

والمصفوفات هي نوع التنفيذ على مستوى منخفض من الشيء. سوف يكون char[] منطقة متجاورة من الذاكرة مع حرف اثنين بايت. سوف يكون Character[] منطقة متجاورة من الذاكرة مع المراجع أربعة أو ثمانية بايت. لا يمكنك الحصول على Character[] التفاف شار []. ومع ذلك لList<Character> يمكن التفاف على char[].

وصالحة من المراجع ليست عادة ما تكون فكرة جيدة إلا إذا كنت كتابة التعليمات البرمجية ذات المستوى المنخفض. يمكن لك، إذا كنت ترغب في ذلك، الكتابة أو الحصول على ما يعادل java.util.Arrays.asList.

وكما ذكر آخرون، لا يوجد autoboxing للصفائف من الأوليات. إذا كنت ترغب في استخدام طريقة مع صفائف البدائية، وسوف تحتاج إلى توفير الزائد لكل نوع بدائي. هذا ويبدو أن طريقة قياسية للقيام بهذه الأمور في مكتبات فئة. رؤية الزائدة في java.util.Arrays ، على سبيل المثال.

أولا، أود في محاولة لتجنب صفائف بقدر ما تستطيع، استخدم القوائم بدلا من ذلك.

وليس هناك autoboxing للصفائف، ولكن هناك autoboxing لvarargs. لذلك إذا قمت بتعريف أسلوب ك (مع نفس الجسم):

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

وبعد ذلك يمكنك كتابة

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

وأنا شخصيا أفضل استخدام الجوافة جوجل، حيث يمكنك كتابة أشياء مثل

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

وكان التعليمة البرمجية الخاصة بك على الأرجح مجرد مثال، ولكن إذا كنت تريد حقا لاختبار العضوية، في يمكنك أن تفعل ذلك مثل هذا:

Chars.contains(chars, ch);

or

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

وأدخل جافا 8 والسماح primArray يكون معرف نوع PrimType[]، فإنك يمكن قم بما يلي:
BoxedType[] boxedArray = IntStream.range(0, primArray.length).mapToObj(i -> primArray[i]).toArray(BoxedType[] :: new);

وهناك طريقة أبسط لتحقيق ذلك هي

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