"super(Car.class);" 在构造函数中做什么?
What does "super(Car.class);" do in a constructor?
我是 java 的初学者。请解释一下 "super(Car.class);" 在构造函数中做了什么?
public class CarDaoImpl extends AbstractDaoImpl<Long, Car> implements CarDao {
public CarDaoImpl() {
super(Car.class);
}
}
根据你在问题中提出的内容,我假设 class AbstractDaoImpl
是这样的:
public class AbstractDaoImpl<S, T> {
public AbstractDaoImpl(Class<T> clazz) {
...
}
}
public class CarDaoImpl extends AbstractDaoImpl<Long, Car> implements CarDao {
public CarDaoImpl() {
super(Car.class);
}
}
所以它要求子classes给他们一个class的<T>
。
为什么要这样做?
你可能听说过 type erasure in Java,这意味着所有的泛型信息将在 运行time 上消失。
传递对 classes 的引用是一种在 运行 可能需要时也保留此信息的方法。
反思
在这种特殊情况下,<T>
的类型可以通过反射来确定。但这是品味和风格的问题,如果我们这样做或直接传递 class,因为反射使用起来不是很直接。
实际上直接传递它是唯一类型安全的方法。
我是 java 的初学者。请解释一下 "super(Car.class);" 在构造函数中做了什么?
public class CarDaoImpl extends AbstractDaoImpl<Long, Car> implements CarDao {
public CarDaoImpl() {
super(Car.class);
}
}
根据你在问题中提出的内容,我假设 class AbstractDaoImpl
是这样的:
public class AbstractDaoImpl<S, T> {
public AbstractDaoImpl(Class<T> clazz) {
...
}
}
public class CarDaoImpl extends AbstractDaoImpl<Long, Car> implements CarDao {
public CarDaoImpl() {
super(Car.class);
}
}
所以它要求子classes给他们一个class的<T>
。
为什么要这样做?
你可能听说过 type erasure in Java,这意味着所有的泛型信息将在 运行time 上消失。
传递对 classes 的引用是一种在 运行 可能需要时也保留此信息的方法。
反思
在这种特殊情况下,<T>
的类型可以通过反射来确定。但这是品味和风格的问题,如果我们这样做或直接传递 class,因为反射使用起来不是很直接。
实际上直接传递它是唯一类型安全的方法。