Я пытаюсь использовать стирание типов для доступа к унаследованным методам общего типа.
У меня есть родительский класс, класс 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));
}
Но я не могу реализовать универсальный тип.Это проблема, которую я пытаюсь обойти.Есть ли лучший способ сделать это?