我正在为Java项目制作一些数学课程。我有一个Vector3类,但我还需要Vector4和Vector2,但显然我不想复制黏贴我的代码3次。
所以我做了一个Vector类,它将是所有向量的母类。我可以只有Vector类没有子类,但我更喜欢拥有这些子类,因为我可以在它们上面添加特定的东西,比如在Vector3中添加欧拉角运算,而且我也想使用Vector4作为Quaternion的母类。无论如何,这是我的简化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中编写一个multiply方法,调用Vector的multiply然后将值复制到Vector2中,但是,1.这很糟糕,2.这将导致子向量之间存在大量重复代码,3.我需要性能,所以这不是理想方法。
我知道我可以使用反射来解决问题,但这些方法对性能至关重要,所以必须尽可能简单。
我还考虑过修改参数中的向量,以便我不必实例化新向量,但这是一个非常糟糕的主意,因为它可能会导致奇怪的行为。
欢迎任何帮助。
Vector3
),而第二个则基于仅一个类的思想(“而不是子类”)。 - Izruonew Vector(values)
。 - Andy Turner