簡體   English   中英

Java泛型 - 檢索類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM