반응형
Java Generics의 구현으로 인해 다음과 같은 코드를 가질 수 없습니다.
public class GenSet<E> {
private E a[];
public GenSet() {
a = new E[INITIAL_ARRAY_LENGTH]; // error: generic array creation
}
}
유형 안전을 유지 하면서이 작업을 구현할 수 있습니까?
나는 이처럼 자바 포럼에서 해결책을 보았습니다.
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
""확인 "또는"선택 해제 "인가?
그게 무슨 뜻이야?
->이 경우 다음을 써야합니다.
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
반응형
'자바' 카테고리의 다른 글
Java는 두 개의 주어진 값 사이에서 난수를 생성합니다 (0) | 2021.04.11 |
---|---|
Java에서 사용자 입력을 가져 오는 방법은 무엇입니까? (0) | 2021.04.11 |
Java에서 객체 배열 만들기 (0) | 2021.04.11 |
ArrayList <문자열>을 문자열 [] 배열로 변환 (0) | 2021.04.10 |
문자열이 Java의 정수인지 확인합니다 (0) | 2021.04.10 |
댓글