본문 바로가기
자바

Java에서 일반 배열을 만드는 방법은 무엇입니까?

by º기록 2021. 4. 11.
반응형

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

 

 

반응형

댓글