두 가지 버그가 있습니다 클래스는 T 타입을 정의하고, 두 번째 방법은 그것을 자신의 타입 T를 정의하지만, 모두 T의 하세 아무것도 서로 할 수 없습니다.
public RegisterSet(int size) {
대신 : 두 번째
public <T> RegisterSet(int size) {
: - 그래서 당신은 방법 선언에서 여분의 타입 T를 제거해야하는 방법 Array.newInstance는 자사의 첫 번째 매개 변수로 클래스의 인스턴스가 필요합니다 그러나 T 형은 클래스의 인스턴스가 아닙니다. - 필요한 것은 생성자 인수 목록에 Class 유형의 새 매개 변수를 삽입하고 배열 생성에이 매개 변수를 사용하는 것입니다.
public class RegisterSet<T> {
public static <T>RegisterSet<T> create(Class<T> clazz, int size) {
return new RegisterSet<T>(clazz, size);
}
private T[] register;
@SuppressWarnings("unchecked")
private RegisterSet(Class<T> clazz, int size) {
if (clazz.isPrimitive()) throw new IllegalArgumentException("Cannot create a RegisterSet of primitives");
register = (T[])Array.newInstance(clazz, size);
}
}
:이 아마 정적 팩토리 메소드입니다 채울 T.에 대한 Class
객체에게 가장 쉬운 방법을 포함하는 변수를 필요
import java.lang.reflect.Array;
public class RegisterSet<T> {
private T[] register;
public RegisterSet(int size, Class<T> clazz) {
@SuppressWarnings("unchecked")
T[] register = (T[]) Array.newInstance(clazz, size);
}
}
...
new RegisterSet<Integer>(5, Integer.class)
@ ApoY2k, 정적 메소드이기 때문에 , 클래스의 타입 파라미터'T'가 범위 내에 없습니다. ''은 반환 유형의 일부도 아니며 'RegisterSet '과 같은 'T'도 아니며 새로운 유형의 변수이며 다른 이름을 부여 할 수도 있습니다.이 메소드는 static RegisterSet create (클래스 clazz, int size) 또는 static RegisterSet create (클래스 clazz, int size) 등으로 사용할 수 있습니다. –
finnw