интерфейсный метод, позволяющий подтипу указывать возвращаемое значение - PullRequest
0 голосов
/ 18 марта 2019

Я наткнулся на странную концепцию при создании API, который эквивалентен перегрузке операторов C ++ (просто теоретически. Он не может перегрузить операторы, но может быть реализован как таковой).

У меня есть интерфейс с именем Operatable<T> (он более математический, но это не важно), в котором все операторы реализованы в виде функций (сложение, вычитание, большее_значение, унарный минус, приращение и т. Д.).

Только математические операции (+, -, *, /) должны быть реализованы, а остальные по умолчанию имеют другое значение. У меня возникла проблема с реализацией оператора квадратных скобок, поскольку тип возвращаемого значения зависит от подкласса и не может быть известен как интерфейс во время компиляции. Я хотел бы знать, можно ли было заставить подкласс реализовать его с определенным типом или это просто невозможно сделать в Java.

Спасибо за помощь!

Edit: Тип возвращаемого значения этой функции не обязательно будет того же типа, что и сам класс, но должен быть определен как подкласс

Edit: Я пробовал дженерики с привязкой к функциям, но это не дает ожидаемого результата.

Вот пример функции в 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)
}

Edit: Я не только собираюсь найти решение, мне просто любопытно, возможно ли это вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...