Как использовать унаследованные методы, используя стирание типа?

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

У меня есть родительский класс, класс Space и дочерние классы Scalar, Vector, Mapping и т. Д. Мне нужен интерфейс 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(Scalar x) конструктор называется.

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

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

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

1 ответ

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

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

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

Другие вопросы по тегам