我正在为 Java 项目制作一些数学课程。我有一个 Vector3 类,但我还需要 Vector4 和 Vector2,但显然我不想复制粘贴我的代码 3 次。
所以我所做的是一个 Vector 类,它将成为所有向量的母类。我可以只使用没有子类的 Vector 类,但我更喜欢使用这些子类,因为我可以在它们上面添加特定的东西,比如 Vector3 中的欧拉角操作,而且我想使用 Vector4 作为四元数的母类。无论如何,这是我简化的 Vector 类:
public class Vector {
public double[] values;
public Vector(double[] values) {
this.values = values;
}
public int getLength() {
return values.length;
}
public static <T extends Vector> T multiply(T vector, double k) {
double[] values = new double[vector.getLength()];
for(int i = 0; i < values.length; i++)
values[i] = k* vector.values[i];
return new T(values);
}
}
public class Vector3 extends Vector {
public Vector3(double[] values) {
super(values);
}
}
问题是编译器不会让我实例化一个 T:“类型参数 T 不能直接实例化”。但是我需要这个 T 因为我需要返回的向量与发送的向量类型相同。
如果我执行 new Vector2(4,2).multiply(42),我需要得到一个 Vector2 而不是一个 Vector。我还可以在 Vector2 中创建一个乘法方法,该方法调用 Vector multiply,然后将值复制到 Vector2 中,但是 1. 这很糟糕,2. 这意味着子向量之间有很多复制粘贴,3. 我需要性能,所以那不理想。
我知道我可以使用反射来解决问题,但这些方法对性能至关重要,所以我必须尽可能简单。
我还考虑过更改参数中的向量,这样我就不必实例化一个新的向量,但这是一个非常糟糕的主意,因为它会导致奇怪的行为。
任何帮助表示赞赏。
当年话下
LEATH
相关分类