我正在尝试使用类型擦除来访问通用类型的继承方法。
我有一个父类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一样扩展了空间,因此将Scalar传递给Function是不可接受的吗?
编辑:
我有每个子类的构造函数,这些构造函数将Scalar作为参数,例如Public Vector(Scalar x){...}
。我希望Mapping
接受一个双精度,将其转换为Scalar
,然后如果函数的Domain
例如是一个Vector,那么我希望{{ 1}}构造函数被调用。
理想情况下,我只有一个双精度的父构造函数:
Vector(Scalar x)
但是我不能实现泛型。这是我要解决的问题。有更好的方法吗?
答案 0 :(得分:0)
使用Function
接口的当前定义,方法of
只能接受类型为Scalar
的对象。 Mapping
类不会编译,因为继承仅在一个方向上起作用。 Scalar
继承自Space
,但Space
不继承自Scalar
。因此,您不能期望Mapping
类能够将Space
对象传递给Function
中的方法。
您的类的设计需要一些重构,但是您不清楚要实现什么,因为设计与自身冲突。
例如,Function
接口仅处理Scalar
值。同时,Mapping
类应采用Space
类型的任何域(Vector
,Scalar
等)。如果要让Mapping
类接受任何Space
类型,则不能将其Function
限制为仅接受Scalar
。