2014-08-29 2 views
0

매개 변수화 된 형식의 클래스 인수를 하위 클래스 형식으로 캐스팅 할 수 있습니까? 형식 매개 변수의 값을 추출하는 과 관련된 많은 예제와 문제점을 읽었으며 을 확장해야하는 인터페이스 또는 추상 클래스가 있어야합니다.매개 변수화 된 형식의 값을 추출 할 때 매개 변수화 된 형식의 클래스 인수를 하위 클래스 형식으로 변환

위의 코드를 사용하여

type = (Class<T>) ((ParameterizedType)(getClass().getGenericSuperclass())).getActualTypeArguments()[0]; 

아래의 코드를 고려, 당신은 (클래스 < T는>) 무엇을 나타내는 지 뭔가에 "유형"변수를 캐스팅 할 수 있습니다. < T>가 Person.class 인 경우

다음은 Person 클래스가 일반 수퍼 클래스 유형 매개 변수 인수로 전달되는 값인 완전한 구현입니다. 제네릭 하위 클래스의 인스턴스를 만들고 을 만들면 Person 유형 매개 변수 인수의 하위 클래스를 전달합니다.이 하위 클래스는 항상 Person으로 형변환됩니다. 유형 == Student.class 인쇄 거짓 또는 내가 유형을 인쇄 할 경우에도, 그 항상 인쇄 사람 대신 학생. 내가 어떻게 이걸 얻을 수 있니? 내가 원하는 것도 가능하니?

일반 하위 클래스

public class GenericSubClass<T extends Person> extends GenericAbstractSuper<Person> { 

public Class<T> type; 

@SuppressWarnings("unchecked") 
public GenericSubClass() { 

    type = (Class<T>) ((ParameterizedType) (getClass().getGenericSuperclass())).getActualTypeArguments()[0]; 

    System.out.println(type.getSimpleName()); 
    System.out.println(type == Student.class); 
} 

public static void main(String[] args) { 

    GenericSubClass<Student> genStud = new GenericSubClass<Student>(); 
// GenericSubClass<Employee> genEmp = new GenericSubClass<Employee>(); 
// GenericSubClass<Person> genPer = new GenericSubClass<Person>(); 
    } 
} 

일반 슈퍼 추상 클래스

public abstract class GenericAbstractSuper<T> { 
} 

는 정말 도움이 필요하세요. 나는 비슷한 문제를 발견 할 수 없다.

+1

하나의 질문 : 정확히 여기에 도착하려고합니까? 왜 이러는거야? 문제에 관해서는 런타임에 형식 매개 변수를 가져올 수 없습니다. 반향의 경우,'GenericAbstractSuper '에서 확장 되었기 때문에 선언 된 타입 매개 변수 인'Person'이 생깁니다. 또한 수퍼 클래스가 제네릭이 아닌 경우 해당 메서드가 실패합니다. –

+0

@Rohit Jain이 말한 것. 게다가 제네릭 사용의 중요한 부분은 효과적으로 사용하면 캐스트 할 필요가 없다는 것입니다.나는 당신이 한 걸음 뒤로 물러나고 당신의 현재 디자인의 더 큰 그림을 볼 필요가 있다고 생각한다. –

+0

응답 주셔서 감사합니다, 실제로 Person 및 해당 하위 클래스 (학생 등) 뭔가를 수행 할 특정 유틸리티 클래스를 만드는 해요,하지만 난 단지 디자인 이런 종류의 Person 속성을 액세스 할 수 있습니다 (예 : 속성 유형 Person의 하위 클래스의 속성), 이렇게 접근 할 수 있는지 조사하려고합니다. 유틸리티 클래스의 실제 이름은 "EntityPropertiesValidator "입니다.이 클래스가 무엇인지 추측 할 수 있습니다. ("EntityPropertiesValidator " – Jeff

답변

3

익명으로 또는 다른 방법으로 GenericSubClass의 하위 클래스를 만들고 싶습니다.

GenericSubClass<Student> genStud = new GenericSubClass<Student>(){}; 

지금

getClass().getGenericSuperclass() 

GenericSubClass<Student>에 대한 Type을 반환하고 당신은 Student을 추출 할 수 있습니다. 이전

,

getClass().getGenericSuperclass() 

그래서 당신은 Person를 추출했다 GenericAbstractSuper<Person>을 반환했다.

이 트릭은 형식 토큰에서 사용됩니다.

+0

ohtype 토큰, Neil Gafter의 Super Type 토큰을 만났을지라도 정말 저에게 특이한 것처럼 보였습니다.하지만 시도해 보았습니다. 나는 그의 접근 방식을 사용하여 다양한 유형을 만들 수 있습니다. [http : // gafter. blogspot.com/2006/12/super-type-tokens.html), 나는 내가 찾을 수있는 모든 것을 활용하면서, 내 디자인과 비슷한 자원으로 내가 원하는 것을 얻을 수 있다면 바랄 뿐이다. 나는 너에게 코드를 작성해 주시면 감사하겠습니다. 대단히 감사합니다. – Jeff

+0

@Jeff Google 구아바에는 정교한 형식의 토큰이 구현되어 있습니다. https://code.google.com/p/guava-libraries/wiki/ReflectionExplained – Marco13

+0

@ Marco13 감사합니다. 그렇기 때문에 필요한 간단한 단어입니다. 또 다른 단계 인 "형식 토큰"을 사용합니다. 나는 제네릭을 계속 파고들 수있는 단어 나 세그먼트를 생각하는 데 어려움을 겪고 있습니다. 고맙습니다 – Jeff

관련 문제