我有一个像这样的泛型类:
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
如何克服此问题并使类型变量可打印?
答案 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访问类型参数。