Java : 원시 데이터 유형의 배열은 자동화되지 않습니다.
-
21-08-2019 - |
문제
다음과 같은 방법이 있습니다.
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;
}
물론 각 원시 유형마다 다른 버전이 필요합니다.
배열은 낮은 수준 구현 유형입니다. 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;