Как использовать унаследованные методы, используя стирание типа?
Я пытаюсь использовать стирание типа для доступа к унаследованным методам общего типа.
У меня есть родительский класс, класс 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
,