2017-01-31 4 views
3

Я создаю классы математики (Java), и мне нужны векторы из двух, трех и четырех измерений (для обработки 3D-графики). Я решил сделать один абстрактный вектор суперкласса, который реализует все распространенное поведение, такое как масштабирование, сложение, вычитание и точечные продукты.принудительно применять параметр того же типа, что и подкласс

Мой вопрос: есть ли способ выразить (с принудительным выполнением при компиляции, а не во время выполнения), что второй вектор, на котором выполняется точечный продукт, должен быть того же типа, что и подкласс, точечный продукт существует (так как они должны иметь одинаковый размер)? (И есть более эффективный способ реализации векторов?) Мой код выглядит следующим образом:

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

Вы используете подклассы для представления векторов разных размеров? Это звучит не так, как быть с этим. – jsheeran

+0

Ну, есть некоторые специфические для измерения черты, как внешний продукт, правильно? Это также помогает обеспечить равенство измерений во время компиляции. С другой стороны, я понял, что это выглядит немного странно и, следовательно, вопрос в круглых скобках. –

ответ

1

Вы должны сделать свой 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 
} 
+1

А, так это действительно вещь? :) Я уже наткнулся на это, но я не был уверен, что это было законно. Благодаря! –

+0

@TempestasLudi Полностью законный, это то же самое, что это сделано с помощью интерфейса 'Comparable' по всему API Java. –

Смежные вопросы