在Java中使用String.format的泛型类型

时间:2015-08-22 09:13:52

标签: java generics

我有一个像这样的泛型类:

public class MyClass<T> {
    private T var;

    public MyClass(T init_value) {
        var=init_value;
    }

    ...
}

现在我想向它添加toString()方法,它返回var的具体类型和值。我尝试这样的事情:

public String toString() {
    return String.format("MyClass object initialized with type %s and value %s", T, var);
}

然而,这不起作用,因为我有一个问题,即类型变量T似乎不能作为普通变量可见。也就是说,我收到一个错误:

T cannot be resolved to a variable

如何克服此问题并使类型变量可打印?

1 个答案:

答案 0 :(得分:2)

由于您已经拥有了课程T的对象,因此您可以使用getClass

String.format("MyClass object initialized with type %s and value %s", var.getClass().getSimpleName(), var);

如果您没有var,您可以选择明确提供Class<T>类型的参数:

public class MyClass<T> {
    private Class<T> clazz;

    public MyClass(Class<T> clazz) {
        this.clazz = clazz;
    }

    public String toString() {
        return String.format("Type of T: %s", clazz.getSimpleName());
    }
}

您必须执行此操作,因为type erasure导致通常无法在运行时访问类型T。唯一的例外是当您定义明确扩展参数化类的类时:class MyIntegerClass extends MyClass<Integer>。在这种情况下,可以通过reflection访问类型参数。