Сначала у вас есть синтаксическая ошибка в объявлении функции расширения. Во-вторых, Number
не определяет автоматически способность добавлять +
другое число. Так что возникает проблема с использованием Number
в качестве базового базового типа. К сожалению, вам нужно будет создать все перестановки, которые вы хотите сделать действительными для всех числовых типов.
Разбить его ...
operator <T: Number> fun Int.plus(p:TestGen<T>) = TestGen(this+p.x,p.y)
неверный синтаксис. Следующее является более корректным, но все равно не скомпилируется по причине «нет метода plus в классе Number
»:
operator fun <T: Number> Int.plus(p:TestGen<T>) = TestGen(this+p.x,p.y)
Таким образом, чтобы исправить это, вам действительно нужно вместо этого сбросить универсальный параметр для функции и указать каждый поддерживаемый тип:
@JvmName("IntPlusTestGenWithInt")
operator fun Int.plus(p:TestGen<Int>) = TestGen(this+p.x,p.y)
@JvmName("IntPlusTestGenWithLong")
operator fun Int.plus(p:TestGen<Long>) = TestGen(this+p.x,p.y)
@JvmName("IntPlusTestGenWithDouble")
operator fun Int.plus(p:TestGen<Double>) = TestGen(this+p.x,p.y)
@JvmName("IntPlusTestGenWithFloat")
operator fun Int.plus(p:TestGen<Float>) = TestGen(this+p.x,p.y)
// etc
Аннотация JvmName
необходима, поскольку вы создаете методы расширения, которые отличаются только общим параметром, который JVM удаляет. Таким образом, внутренне байт-код, сгенерированный Kotlin, должен дифференцировать каждый метод расширения по имени, даже если вы не увидите этого из кода Kotlin.
Вам потребуются аналогичные варианты функций для всех типов, к которым вы добавляете и для чего. И вы должны рассмотреть, что вы делаете с частями чисел, которые больше не имеют смысла, например, десятичная часть Double
, добавленная к Int
.