如何打印泛型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