728x90
반응형
질문 : Java에서 일반 배열을 만드는 방법은 무엇입니까?
Java 제네릭 구현으로 인해 다음과 같은 코드를 가질 수 없습니다.
public class GenSet<E> {
private E a[];
public GenSet() {
a = new E[INITIAL_ARRAY_LENGTH]; // error: generic array creation
}
}
형식 안전성을 유지하면서 어떻게 구현할 수 있습니까?
Java 포럼에서 다음과 같은 솔루션을 보았습니다.
import java.lang.reflect.Array;
class Stack<T> {
public Stack(Class<T> clazz, int capacity) {
array = (T[])Array.newInstance(clazz, capacity);
}
private final T[] array;
}
그러나 나는 정말로 무슨 일이 일어나고 있는지 이해하지 못합니다.
답변
나는 그 대가로 질문을해야합니다 : 당신의 GenSet
"선택"또는 "선택 취소"입니까? 그게 무슨 뜻입니까?
- 선택 : 강력한 타이핑 .
GenSet
은 포함 된 객체의 유형을 명시 적으로 알고 있습니다 (예 : 생성자가Class<E>
E
유형이 아닌 인수가 전달되면 예외가 발생합니다.Collections.checkedCollection
참조하십시오.-> in 이 경우 다음과 같이 작성해야합니다.public class GenSet<E> { private E[] a; public GenSet(Class<E> c, int s) { // Use Array native method to create array // of a type only known at run time @SuppressWarnings("unchecked") final E[] a = (E[]) Array.newInstance(c, s); this.a = a; } E get(int i) { return a[i]; } }
- 선택 취소 : 약한 입력 . 인수로 전달 된 객체에 대해 실제로 유형 검사가 수행되지 않습니다. ->이 경우 다음과 같이 작성해야합니다.
배열의 구성 요소 유형은 유형 매개 변수 의 삭제 여야합니다.public class GenSet<E> { private Object[] a; public GenSet(int s) { a = new Object[s]; } E get(int i) { @SuppressWarnings("unchecked") final E e = (E) a[i]; return e; } }
public class GenSet<E extends Foo> { // E has an upper bound of Foo private Foo[] a; // E erases to Foo, so use Foo[] public GenSet(int s) { a = new Foo[s]; } ... }
이 모든 결과는 Java에서 제네릭의 알려진, 의도적 인 약점에서 비롯된 것입니다. 삭제를 사용하여 구현되었으므로 "제네릭"클래스는 런타임에 어떤 유형 인수로 생성되었는지 알지 못하므로 유형을 제공 할 수 없습니다. 명시적인 메커니즘 (유형 검사)이 구현되지 않는 한 안전합니다.
출처 : https://stackoverflow.com/questions/529085/how-to-create-a-generic-array-in-java
728x90
반응형
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
Java에서 다른 생성자를 호출하는 방법 (0) | 2022.02.01 |
---|---|
Java에서 ==와 equals ()의 차이점 (0) | 2022.01.06 |
Java "."(점)으로 분할 된 문자열을 만드는 방법 (0) | 2021.12.29 |
Java에서 파일의 파일 확장자를 얻는 방법 (0) | 2021.12.29 |
NullPointerExceptions를 방지하기 위해 어떤 @NotNull Java 주석을 사용해야 할까? (0) | 2021.12.29 |