在实现接口的abstact类中使用泛型

时间:2018-10-10 16:51:17

标签: java generics

我还没有使用泛型,所以我不确定如何在我的情况下使用它们。我要实现的目标是创建一个将在其中使用泛型的超类Vector,然后创建3个子类,其中将泛型类型设置为维之一。这是我现在拥有的:

interface sample {
    Vector sum(Vector vec);

    Vector subtraction(Vector vec);

    int product(Vector vec);

    boolean compare(Vector vec);

    String ToString();
}

abstract class Vector implements sample {
    int[] coordinates;

    public Vector(int[] coordinates) {
        this.coordinates = coordinates;
    }

    abstract Vector resVec();

    public Vector sum(Vector vec) {
        Vector result = resVec();
        if (this.coordinates.length == vec.coordinates.length) {
            for (int i = 0; i < vec.coordinates.length; i++) {
                result.coordinates[i] = this.coordinates[i] + vec.coordinates[i];
            }
        } else {
            throw new ArithmeticException("Can't sum vectors of different length");
        }
        return result;
    }

和两个子类,例如: 1)

class Vector3D extends Vector {

    public Vector3D(int n1, int n2, int n3) {
        super(new int[]{n1, n2, n3});
    }

    public Vector3D resVec() {
        Vector3D resVec = new Vector3D(0, 0, 0);
        return resVec;
    }

    public Vector3D sum(Vector vec) {
        return (Vector3D) super.sum(vec);
    }

2)

class Vector5D extends Vector {
    public Vector5D(int n1, int n2, int n3, int n4, int n5) {
        super(new int[]{n1, n2, n3, n4, n5});
    }

    public Vector5D resVec() {
        Vector5D resVec = new Vector5D(0, 0, 0, 0, 0);
        return resVec;
    }

    public Vector5D sum(Vector vec) {
        return (Vector5D) super.sum(vec);
    }

因此,例如,如果要输入以下内容,我想要得到的结果是:Vector3D vec1 = new Vector3D(1,2,3); Vector5D vec2 =新的Vector5D(1,2,3,4,5);并使用A.sum(B);由于将错误的变量类型传递给sum方法,我应该得到一个编译错误。谢谢!

1 个答案:

答案 0 :(得分:0)

这不是类型层次结构的责任;这是具体班级的责任。

这里最大的事情是您的sum方法接受一种Vector类型,并且该sum方法的实现者应该知道它们是有效类型还是无效类型可以胜任。实际需要的只是向您的instanceof方法添加sum支票。

如果您想确保向量集合之间的类型同质性,泛型会有所帮助,但是当您知道每个向量都可以运行的事实时,在这种情况下,我认为它没有太大的价值。