where generic тип поддерживает операцию сложения
Допустим я хочу реализовать операцию сложения для произвольных аргументов:
fun <A, B, RES> sum(a: A, b: B): RES = a + b
Разумеется оператор A.plus(B) не реализован.
Хорошо, тогда создадим интерфейс:
interface SummableWith<IN, OUT>{
operator fun plus(other: IN): OUT;
}
fun <A, B, RES> sum(a: A, b: B): RES where A : SummableWith<B, RES> = a + b
Но вот незадача: теперь тип A обязательно должен наследовать мой интерфейс, а добавлять интерфейсы с уже созданным типам я не могу (например к Int).
Как я могу указать, что переменные типов A и B имеют поддержку операции A.plus(B)?
При этом мне необходимо знать тип RES, поэтому проверкой типов в рантайме обойти не получится