Я наткнулся на странную концепцию при создании 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:
Я не только собираюсь найти решение, мне просто любопытно, возможно ли это вообще.