"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,因为反射使用起来不是很直接。

实际上直接传递它是唯一类型安全的方法。