强制param与子类相同的类型

时间:2017-01-31 13:16:49

标签: java

我正在创建一些数学(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
}

1 个答案:

答案 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
}