toString()Java中的泛型类型

Dav*_*les 5 java generics

如何打印通用java类型的类型?

反射?任何招数?

public class Foo<K> {

    private K element;

    @Override
    public String toString() {
        return "Type: " + K;
    }
}
Run Code Online (Sandbox Code Playgroud)

har*_*rto 6

element.getClass().getSimpleName() 可能会做你期望的事情.

  • K.class不起作用(可能甚至不编译).是的,你需要进行空检查.不,由于类型擦除没有别的办法(没有关于K的运行时信息,除非你自己存储). (3认同)

Esk*_*ola 6

由于类型擦除,您无法知道构造类时类型参数是什么.但是您可以使用element.getClass()获取元素的运行时类型(可能是类型参数的子类,尽管不能保证 - 可能有未经检查的强制转换).

但是,有一些技巧可以访问类型参数.Guice可以做一些技巧.此外,如果你创建一个Foo的子类,如下所示:( Foo<Integer> foo = new Foo<Integer>(){};注意{}它使它成为Foo的匿名子类),然后可以访问type参数,ParameterizedType type = (ParameterizedType) foo.getClass().getGenericSuperclass()然后调用ParameterizedType的方法.这是Guice利用的Java反射API的特性.