【发布时间】:2018-01-11 12:52:28
【问题描述】:
考虑以下通用转换器类(为简洁而简化/不完整)...
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!
}
}
在子类的外部,我可以毫无问题地调用第一个 convert。考虑使用Car 作为泛型类型参数的这个子类。我可以传入Car.class,像这样……
public class CarConverter extends BaseConverter<Car>
{
public void someFunction()
{
String someString;
convert(someString, Car.class);
}
}
我正在尝试做的是尽可能多地移动到基类。由于'Car'在这里是已知的,因此convert 期望Car.class,而TModel 代表基类中的Car(无论如何对于这个具体的BaseConverter),我试图在基类中使用TModel.class,但如前所述,它不起作用。
那么你如何在 Java 中实现这一点?
【问题讨论】:
-
我认为没有等价物。类型在编译时是未知的,那么编译器会用什么替代?你传入
convert中的类类型,为什么不使用相同的技术呢?向 ctor 添加一个类类型,它会为您提供一个用于转换器的基类。 -
但仅此而已......它在编译时是已知的。例如,如果我在返回 TModel 的 BaseConverter 中添加一个函数,如果您查看子类上的签名,它将返回 Car,因为编译器知道该类型。关键是编译器确实知道传递给它的内容,否则它无法解析任何用法。其他语言允许这样做。猜猜这只是Java的限制。
-
其实我认为你想要在第二个
convert方法中实现的是第一个convert完全 所做的。Class<TModel>将是子类的泛型类型参数的Class对象。 -
也许您在第一个
convert中想要实现的目标应该是:public void convert(String data, Class<? extends TModel> classOfModelType) { } -
但是 TModel 不只是类型的占位符吗?你如何扩展实际上不存在的东西?我承认我是 Java 新手,所以我不确定这是什么,因为我从未见过 '?之前扩展了 TModel'。