2011-01-19 4 views
1

Java 프로젝트에 대한 사용자 지정 제네릭 클래스를 만들고 싶습니다.이 코드는 제가 가지고있는 것입니다. 코드를 일반적인 배열을 만드는 방법에 대한 예제로 발견했습니다. 나는이 문제를 해결할 수있는 방법 -배열이있는 일반 클래스

public class RegisterSet<T> { 
    private T[] register; 
    public <T> RegisterSet(int size) { 
     register = (T[])Array.newInstance(T, size); 
    } 
} 

는 지금, 나는 나에게 전혀 의미가없는 오류 Incompatible types - found: T[], required: T[]를 얻을?

답변

1

:처럼 적어도 모두 함께

이 보일 것입니다 정적 방법으로 말하면

RegisterSet<String> x = RegisterSet.create(String.class, 42); 

이는 sligh입니다. 더 짧고 덜 반복적입니다.

RegisterSet<String> x = new RegisterSet<String>(String.class, 42); 
+0

@ ApoY2k, 정적 메소드이기 때문에 , 클래스의 타입 파라미터'T'가 범위 내에 없습니다. ''은 반환 유형의 일부도 아니며 'RegisterSet '과 같은 'T'도 아니며 새로운 유형의 변수이며 다른 이름을 부여 할 수도 있습니다.이 메소드는 static RegisterSet create (클래스 clazz, int size) 또는 static RegisterSet create (클래스 clazz, int size) 등으로 사용할 수 있습니다. – finnw

4

T라는 두 개의 다른 형식 매개 변수가 있기 때문에 완벽합니다. 그러나 코드를 컴파일하는 방법을 알 수 없으므로이를 수정하는 것은 다소 어렵습니다. 이 비트를 고려하십시오 :

Array.newInstance(T, size); 

T는 메소드의 인수로 사용할 수 없습니다.

유형 삭제로 인해 올바른 유형의 배열을 만들려면 관련 Class 인스턴스를 지정해야합니다. 예를 들면 :

public class RegisterSet<T> { 
    private T[] register; 
    public RegisterSet(Class<T> clazz, int size) { 
     register = (T[])Array.newInstance(clazz, size); 
    } 
} 

...하지만 난 당신이 여기에 사용하려는 어떤 Array 클래스 확실하지 않다.

첫째 :

0

두 가지 버그가 있습니다 클래스는 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) 
+0

그러면 새 오브젝트가 어떻게 생성됩니까? 예를 들어 보았습니다. '새로운 RegisterSet (5, Integer)'하지만 작동하지 않습니다 (분명히) - 그러나 나는 그것을 올바르게하는 방법에 대한 예제를 찾지 못했습니다. –

+0

물론 작동하지 않습니다. 왜냐하면 Integer 클래스의 인스턴스가 아니기 때문에 Integer.class는 다음과 같이 작성해야합니다. 'new RegisterSet (5, Integer.class)' – Ralph