我正在创建一些数学 (Java) 类(class),我需要两个、三个和四个维度的 vector (用于处理 3D 图形)。我决定创建一个抽象父类(super class) Vector,它实现所有常见行为,例如缩放、加法、减法和点积。
我的问题是:有什么方法可以表达(在编译时强制执行,而不是在运行时执行)执行点积的第二个 vector 必须与点积所在的子类具有相同的类型(因为他们必须有相同的维度)? (是否有更有效的方式来实现 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
}
最佳答案
您需要使您的 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
}
关于java - 强制参数与子类类型相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41958604/