Как использовать унаследованные методы, используя стирание типа? - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь использовать стирание типов для доступа к унаследованным методам общего типа.

У меня есть родительский класс, класс Space и дочерние классы, Scalar, Vector, Mapping и т. Д. Iмне нужен интерфейс Function, для которого я могу указать домен и диапазон среди различных дочерних классов Space.

Класс Mapping содержит интерфейс Function и должен иметь возможность доступа к нему через метод, Of.

Если программист хочет взять отображение двойного, то есть

Mapping map = new Mapping(...);
Scalar answer = map(0.0);

, тогда я хочу, чтобы функция Of преобразовала двойное в скаляр и затем передалаэто к интерфейсу, Function.

public class Mapping<Domain extends Space, Range extends Space> extends Space{

    protected Function<Domain,Range> function;

    public Range of(Double point){
        return function.of(new Scalar(point)); //Error, the type <Domain,Range> is not applicable to type Scalar.
    }
}

public interface Function<Domain extends Space,Range extends Space>{
    public Range of(Domain point);
}

public class Scalar extends Space {
    protected double value=0.0;
    public Scalar(double in){
        value = in;
    }

Eclipse рекомендует приводить Scalar к Domain, но, поскольку Domain расширяет пространство, как и Scalar, разве скаляр не должен быть приемлемым для передачи в Function?

Редактировать:

У меня есть конструкторы для каждого дочернего класса, которые принимают в качестве аргумента Scalar, например, Public Vector(Scalar x){...}.Я хочу, чтобы Mapping взял двойное число, преобразовал его в Scalar, а затем, если Domain функции, например, Vector, то я бы хотел, чтобы конструктор Vector(Scalar x) вызывался.

В идеале, я бы просто использовал родительский конструктор типа double:

public Range of(Double point){
    return function.of(new Domain(point));
}

Но я не могу реализовать универсальный тип.Это проблема, которую я пытаюсь обойти.Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 04 октября 2018

При текущем определении интерфейса Function метод of может принимать только объект типа Scalar.Класс Mapping не будет компилироваться, потому что наследование работает только в одном направлении.Scalar наследуется от Space, но Space не наследуется от Scalar.Таким образом, вы не можете ожидать, что класс Mapping сможет передавать объект Space в метод в Function.

Дизайн ваших классов требует некоторого рефакторинга, но не совсем понятно, что выхочу достичь, потому что дизайн конфликтует сам с собой.

Например, интерфейс Function имеет дело только со значениями Scalar.Между тем ожидается, что класс Mapping будет использоваться в любом домене типа Space (Vector, Scalar и т. Д.).Если вы хотите, чтобы ваш Mapping класс принимал любой тип Space, то вы не можете ограничить его Function только для Scalar.

...