문제

다음과 같은 방법이 있습니다.

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

이제 a를 사용 하여이 방법을 호출하려고합니다 char ~을 위한 T:

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

이것은 작동하지 않습니다. 나는 기대할 것이다 char 그리고 char[] 오토 옥스에 이루어집니다 Character 그리고 Character[], 그러나 그것은 일어나지 않는 것 같습니다.

통찰력이 있습니까?

도움이 되었습니까?

해결책

배열에 대한자가 옥스화는 없으며 프리미티브에만 해당됩니다. 나는 이것이 당신의 문제라고 생각합니다.

다른 팁

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

맞습니다. 배열에 대한자가 옥시 징이 없습니다 (경우와 같은 경우에는 이상하게 발생합니다. 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;
}

물론 각 원시 유형마다 다른 버전이 필요합니다.

이는 비싼자가 옥스 작업을 피하기 위해 설계에 의한 것으로 보이며, 제네릭은 기존 Java Bytecode와 거꾸로 호환되어야하기 때문입니다.

보다 이 기사 그리고 이 버그, 예를 들어.

배열은 낮은 수준 구현 유형입니다. char[] 2 바이트 숯이있는 인접한 메모리 영역이 될 것입니다. Character[] 4 ~ 8 바이트 참조가있는 인접한 메모리 영역이 될 것입니다. 당신은 얻을 수 없습니다 Character[] char []를 감싸려면. 그러나 a List<Character> 포장 할 수 있습니다 char[].

저수준 코드를 작성하지 않는 한 참조 배열은 일반적으로 좋은 생각이 아닙니다. 원한다면 java.util.Arrays.asList.

다른 사람들이 언급했듯이, 프리미티브의 배열에 대한자가 옥시는 없습니다. 원시 배열과 함께 방법을 사용하려면 각 원시 유형에 대해 과부하를 제공해야합니다. 이것은 수업 라이브러리에서 일을하는 표준 방법 인 것 같습니다. 오버로드를 참조하십시오 java.util.arrays, 예를 들어.

먼저, 가능한 한 배열을 피하려고 노력하고 대신 목록을 사용합니다.

어레이에 대한자가 옥시 징은 없지만 varargs에 대한 오토 옥싱이 있습니다. 따라서 방법을 (같은 몸매로)로 선언하면 :

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

그런 다음 글을 쓸 수 있습니다

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

개인적으로, 나는 당신이 다음과 같은 것을 쓸 수있는 Google의 Guava를 사용하는 것을 선호합니다.

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')

Java 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;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top