允许子类型指定返回值的接口方法

时间:2019-03-18 15:33:46

标签: java operator-overloading

在创建与C ++的运算符重载等效的API时,我偶然发现了一个奇怪的概念(只是理论上。它实际上不能重载运算符,但可以这样实现)。

我有一个名为Operatable<T>的接口(它是基于数学的,但这并不重要),该接口将所有运算符都实现为函数(加,减,大于,一元减,增量等)。

只需要执行数学运算(+,-,*,/),其余的默认为其他值。我在实现方括号运算符时遇到问题,因为返回类型取决于子类,并且在编译时无法作为接口知道。我想知道是否有可能使子类以特定类型实现它,或者这在Java中是不可能做到的。

感谢所有帮助!

编辑: 此函数的返回类型不一定与该类本身具有相同的类型,而应将其定义为子类

编辑: 我已经尝试过函数绑定的泛型,但这没有给我预期的结果。

这是ComplexDouble类中函数的示例:

public class ComplexDouble extends ComplexNumber<Double> implements Operatable<ComplexDouble> {
    @Override
    public double /*or Double if necessary*/ elementAt (String compName) {
        if (compName.contentEquals("real")) return realComp;
        if (compName.contentEquals("imaginary")) return imagComp;
        throw new NoSuchElementException("The key \"" + compName + "\" is not recognized by " + this.getClass().getCanonicalName());
    }
}

这是Operatable<T>中的替代函数:

public interface Operatable<T> {
    public <K> /*return type here*/ elementAt(K key); // the first generic argument for the parameter works, just not for the return type
    // with the generic type K the subclass can't specify the type (naturally)
}

编辑: 我不仅要寻求解决方案,而且只是想知道是否有可能。

0 个答案:

没有答案