어떻게하면 되나요?
public class GenericClass<T>
{
public Type getMyType()
{
//How do I return the type of T?
}
}
지금까지 시도한 모든 것은 항상 Object
사용 된 특정 유형이 아닌 유형을 반환합니다 .
답변
다른 사람들이 언급했듯이 특정 상황에서는 반사를 통해서만 가능합니다.
실제로 유형이 필요한 경우 일반적인 (유형 안전) 해결 방법 패턴입니다.
public class GenericClass<T> {
private final Class<T> type;
public GenericClass(Class<T> type) {
this.type = type;
}
public Class<T> getMyType() {
return this.type;
}
}
답변
나는 이런 것을 보았다
private Class<T> persistentClass;
public Constructor() {
this.persistentClass = (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
}
에서 절전 GenericDataAccessObjects 예
답변
제네릭이되지 않습니다 구체화 실행시. 이는 정보가 런타임에 존재하지 않음을 의미합니다.
투어 드 힘이 자바에 제네릭을 이전 버전과의 호환성을 mantaining하는 동안 추가 (당신은 그것에 대해 독창적 인 논문을 볼 수 있습니다 : 과거에 대한 미래의 안전을 만들기 : 자바 프로그래밍 언어들이 generic을 추가 ).
이 주제에 대한 풍부한 문헌이 있으며 일부 사람들은 현재 상태에 불만을 가지고 있으며 , 일부 사람들은 실제로 그것이 미끼 이며 실제로 필요하지 않다고 말합니다. 두 링크를 모두 읽을 수 있습니다.
답변
구아바를 사용하십시오.
import com.google.common.reflect.TypeToken;
import java.lang.reflect.Type;
public abstract class GenericClass<T> {
private final TypeToken<T> typeToken = new TypeToken<T>(getClass()) { };
private final Type type = typeToken.getType(); // or getRawType() to return Class<? super T>
public Type getType() {
return type;
}
public static void main(String[] args) {
GenericClass<String> example = new GenericClass<String>() { };
System.out.println(example.getType()); // => class java.lang.String
}
}
얼마 전 추상 클래스와 하위 클래스를 포함한 본격적인 예제를 여기에 게시했습니다 .
참고 :이 당신이 인스턴스화해야합니다 서브 클래스 의 GenericClass
제대로 유형 매개 변수를 바인딩 할 수 있도록합니다. 그렇지 않으면 유형을로 반환합니다 T
.
답변
물론 넌 할 수있어.
Java는 이전 버전과의 호환성을 위해 런타임에 정보를 사용 하지 않습니다 . 그러나 정보는 실제로 메타 데이터로 존재 하며 리플렉션을 통해 액세스 할 수 있습니다 (그러나 여전히 유형 확인에는 사용되지 않습니다).
공식 API에서 :
그러나 귀하의 시나리오에서는 리플렉션을 사용하지 않습니다. 개인적으로 프레임 워크 코드에 사용하는 경향이 있습니다. 귀하의 경우 유형을 생성자 매개 변수로 추가합니다.
답변
Java 제네릭은 대부분 컴파일 시간이므로 유형 정보가 런타임에 손실됩니다.
class GenericCls<T>
{
T t;
}
같은 것으로 컴파일됩니다
class GenericCls
{
Object o;
}
런타임에 유형 정보를 얻으려면 ctor의 인수로 추가해야합니다.
class GenericCls<T>
{
private Class<T> type;
public GenericCls(Class<T> cls)
{
type= cls;
}
Class<T> getType(){return type;}
}
예:
GenericCls<?> instance = new GenericCls<String>(String.class);
assert instance.getType() == String.class;
답변
public abstract class AbstractDao<T>
{
private final Class<T> persistentClass;
public AbstractDao()
{
this.persistentClass = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass())
.getActualTypeArguments()[0];
}
}