매개 변수화 된 형식의 클래스 인수를 하위 클래스 형식으로 캐스팅 할 수 있습니까? 형식 매개 변수의 값을 추출하는 과 관련된 많은 예제와 문제점을 읽었으며 을 확장해야하는 인터페이스 또는 추상 클래스가 있어야합니다.매개 변수화 된 형식의 값을 추출 할 때 매개 변수화 된 형식의 클래스 인수를 하위 클래스 형식으로 변환
위의 코드를 사용하여
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> {
}
는 정말 도움이 필요하세요. 나는 비슷한 문제를 발견 할 수 없다.
하나의 질문 : 정확히 여기에 도착하려고합니까? 왜 이러는거야? 문제에 관해서는 런타임에 형식 매개 변수를 가져올 수 없습니다. 반향의 경우,'GenericAbstractSuper'에서 확장 되었기 때문에 선언 된 타입 매개 변수 인'Person'이 생깁니다. 또한 수퍼 클래스가 제네릭이 아닌 경우 해당 메서드가 실패합니다. –
@Rohit Jain이 말한 것. 게다가 제네릭 사용의 중요한 부분은 효과적으로 사용하면 캐스트 할 필요가 없다는 것입니다.나는 당신이 한 걸음 뒤로 물러나고 당신의 현재 디자인의 더 큰 그림을 볼 필요가 있다고 생각한다. –
응답 주셔서 감사합니다, 실제로 Person 및 해당 하위 클래스 (학생 등) 뭔가를 수행 할 특정 유틸리티 클래스를 만드는 해요,하지만 난 단지 디자인 이런 종류의 Person 속성을 액세스 할 수 있습니다 (예 : 속성 유형 Person의 하위 클래스의 속성), 이렇게 접근 할 수 있는지 조사하려고합니다. 유틸리티 클래스의 실제 이름은 "EntityPropertiesValidator"입니다.이 클래스가 무엇인지 추측 할 수 있습니다. ("EntityPropertiesValidator " –
Jeff