泛型类中的 T.class 相当于什么?

Mar*_*eIV 6 java generics class

考虑以下通用转换器类(为简洁起见,已简化/不完整)...

public abstract class BaseConverter <TModel>
{
    public void convert(String data, Class<TModel> classOfModelType)
    {
    }

    public void convert(String data)
    {
        convert(data, TModel.class); // This doesn't work!
    }
}
Run Code Online (Sandbox Code Playgroud)

在子类外部,我可以convert毫无问题地调用第一个。将此子类视为Car泛型类型参数。我可以进去Car.class,像这样...

public class CarConverter extends BaseConverter<Car>
{
    public void someFunction()
    {
        String someString;
        convert(someString, Car.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

我想做的就是尽可能多地移动到基类。由于 'Car' 在这里是已知的,因此convert需要Car.class, 并在基类中TModel表示Car(无论如何对于这个具体的 BaseConverter ),我试图TModel.class在基类中使用,但如上所述,它不起作用。

那么如何在 Java 中实现这一点呢?

csa*_*der 5

这是 Java 中泛型的限制。泛型仅存在于编译时,即在运行时该对象只是一个BaseConverter,因此您无法查询它的泛型类型。最简单的解决方案通常是在调用方法时传入一个Class<TModel>对象(就像您所做的那样)。BaseConverter如果您不想多次传递它,也可以将它传递给构造函数。

  • 您最终不会得到 4 个类,而只有一个:其中“TModel”被“Object”替换的类。因此初始类型信息丢失了(实际术语是_擦除_)并且无法恢复。 (2认同)