프로그래밍 언어/JAVA

Java에서 일반 배열을 만드는 방법

Rateye 2021. 12. 29. 11:25
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
반응형