如何打印泛型Java類型的類型?toString()Java中的泛型類型
反射?任何技巧?
public class Foo<K> {
private K element;
@Override
public String toString() {
return "Type: " + K;
}
}
如何打印泛型Java類型的類型?toString()Java中的泛型類型
反射?任何技巧?
public class Foo<K> {
private K element;
@Override
public String toString() {
return "Type: " + K;
}
}
element.getClass().getSimpleName()
可能會對你期待什麼。
由於type erasure,當構造類時,無法知道類型參數是什麼。但是你可以使用element.getClass()
來獲取元素的運行時類型(雖然不能保證 - 可能是未經檢查的轉換),但它可能是類型參數的子類。
但是,有一些技巧可以訪問類型參數。有一些技巧,Guice can do。此外,如果您創建Foo的子類,如下所示:Foo<Integer> foo = new Foo<Integer>(){};
(注意{}
使其成爲Foo的匿名子類),那麼可以通過ParameterizedType type = (ParameterizedType) foo.getClass().getGenericSuperclass()
訪問類型參數,然後調用ParameterizedType的方法。這是Guice利用Java反射API的特性。
K.class.getSimpleName()是否也有訣竅?自從我java'd已經超過10年了,所以我錯過了泛型。我可能錯了。 – spender 2010-04-01 00:51:41
但是,如果元素變量未初始化,是否有任何其他方式獲得類型而不會得到空指針異常? – 2010-04-01 00:52:12
K.class將不起作用(可能不會編譯)。是的,你需要進行空值檢查。不,沒有其他方式,因爲類型擦除(沒有關於K的運行時信息,除非你自己存儲它)。 – Thilo 2010-04-01 00:57:39