如何使用类型擦除使用继承的方法?

时间:2018-10-04 02:30:41

标签: java inheritance types erasure

我正在尝试使用类型擦除来访问通用类型的继承方法。

我有一个父类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)

但是我不能实现泛型。这是我要解决的问题。有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

使用Function接口的当前定义,方法of只能接受类型为Scalar的对象。 Mapping类不会编译,因为继承仅在一个方向上起作用。 Scalar继承自Space,但Space不继承自Scalar。因此,您不能期望Mapping类能够将Space对象传递给Function中的方法。

您的类的设计需要一些重构,但是您不清楚要实现什么,因为设计与自身冲突。

例如,Function接口仅处理Scalar值。同时,Mapping类应采用Space类型的任何域(VectorScalar等)。如果要让Mapping类接受任何Space类型,则不能将其Function限制为仅接受Scalar