我正在创建一些数学(Java)类,我需要两维,三维和四维矢量(用于处理3D图形)。我决定制作一个抽象超类Vector,它实现了所有常见的行为,比如缩放,加法,减法和点积。
我的问题是:有没有办法表达(强制执行编译,而不是运行时)执行点积的第二个向量必须与点积存在的子类相同(从那以后)它们必须具有相同的尺寸)? (有没有更有效的方法来实现向量?)我的代码如下所示:
public abstract class Vector {
protected float[] coordinates;
protected Vector(float[] coordinates, int length) {
this.coordinates = Arrays.copyOf(coordinates, length);
}
public float int dotproduct(/* Type? */ vector) {
// do something
}
}
class Vector2 extends Vector {
// stuff
}
class Vector3 extends Vector {
// stuff, including outer product
}
答案 0 :(得分:2)
您需要使Vector
类具有通用的子类型。这称为F-bound type(或只是递归类型):
public abstract class Vector<T extends Vector<T>> {
protected float[] coordinates;
protected Vector(float[] coordinates, int length) {
this.coordinates = Arrays.copyOf(coordinates, length);
}
public float int dotproduct(T vector) {
// do something
}
}
然后:
class Vector2 extends Vector<Vector2> {
// stuff
}
class Vector3 extends Vector<Vector3> {
// stuff, including outer product
}