1

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

我有一个父类 Space 和子类 Scalar、Vector、Mapping 等。我想要一个接口 Function,我可以为它指定 Space 的各种子类之间的域和范围。

Mapping 类包含接口 Function,并且应该能够通过方法 Of 访问它。

如果程序员想取一个双精度的映射,即

Mapping map = new Mapping(...);
Scalar answer = map(0.0);

然后我希望函数 Of 将双精度转换为标量,然后将其传递给接口函数。

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 扩展了 Space,Scalar 也是如此,所以 Scalar 不应该被接受传递给 Function 吗?

编辑:

我有每个子类的构造函数,它们将 Scalar 作为参数,例如Public Vector(Scalar x){...}. 我想Mapping接受一个双精度数,将其转换为 a Scalar,然后如果Domain函数的 是,例如,一个向量,那么我想Vector(Scalar x)调用构造函数。

理想情况下,我只会有一个双精度的父构造函数:

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

但我无法实现泛型类型。这是我试图解决的问题。有没有更好的方法来做到这一点?

4

1 回答 1

0

在当前的Function接口定义下,该方法of只能接受类型为 的对象Scalar。该类Mapping将无法编译,因为继承仅在一个方向上起作用。Scalar继承自Space,但Space不继承自Scalar。所以你不能指望Mapping类能够将Space对象传递给Function.

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

例如,Function接口只处理Scalar值。同时,Mapping该类有望采用任何Space类型的域(VectorScalar等)。如果您希望您的Mapping班级接受任何Space类型,那么您不能将其限制Function为仅接受Scalar

于 2018-10-04T03:13:45.710 回答