[英]Java generics - retrieve type
public Interface Foo<T extends Colors>{...}
有沒有辦法檢索為Foo的實現提供哪個T?
例如,
public Class FooImpl implements Foo<Green>{..}
將返回格林。
與其他答案相反,您可以獲取通用參數的類型。 例如,將此添加到泛型類中的方法將獲取該類的第一個泛型參數(在您的情況下為T
):
ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass();
type.getActualTypeArguments()[0]
我在我編寫的通用Hibernate DAO中使用這種技術,因此我可以獲得實際的類被持久化,因為它是Hibernate所需要的。 有用!
編輯
事實證明,這種情況可以獲得通用信息。 Singleshot發布了一個答案就是這么做的。 他應該是公認的答案。 重新認定我的。
但總的來說,在很多情況下,您無法獲得可能存在的類型信息。 Java使用一種稱為類型擦除的技術,它在編譯時從泛型中刪除類型。 這可以防止您在許多情況下在運行時獲取有關其實際綁定的信息。
這個主題的好常見問題:
有。 查看[Javadoc for java.lang.Class#getGenericInterfaces()]( http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html#getGenericInterfaces()) 。
像這樣:
public class Test1 {
interface GenericOne<T> {
}
public class Impl implements GenericOne<Long> {
}
public static void main(String[] argv) {
Class c = (Class) ((ParameterizedType) Impl.class.getGenericInterfaces()[0]).getActualTypeArguments()[0];
System.out.println(c);
}
}
一種方法是使用類型顯式傳入Class對象。 類似於以下內容:
public class FooImpl<T extends Colors> {
private Class<T> colorClass;
public FooImpl(T colorClass) {
this.colorClass = colorClass;
}
public Class<T> getColorClass() {
return colorClass;
}
}
取決於你的意思。 Just T
可能就是你想要的,例如:
public Interface Foo<T extends Colors>{ public T returnType() {...} ...}
[編輯]好的,顯然部分可能。 如何做的很好的解釋,(包括對SingleShot發布的方法的改進): http : //www.artima.com/weblogs/viewpost.jsp? thread = 208860
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.