дженерики kotlin и перегрузка операторов - PullRequest
0 голосов
/ 01 ноября 2018

Я хочу сделать что-то подобное

data class TestGen<T: Number>(var x : T, var y : T)

public operator<T:Number> fun Int.plus(p:TestGen<T>) = TestGen(this+p.x,p.y)

так как я могу это сделать? или любая другая идея сделать то же самое? потому что я хочу сделать что-то вроде этого

public operator fun Int.plus(p:TestGen<Float>) = TestGen(this+p.x,p.y)
public operator fun Int.plus(p:TestGen<Double>) = TestGen(this+p.x,p.y)

1 Ответ

0 голосов
/ 01 ноября 2018

Сначала у вас есть синтаксическая ошибка в объявлении функции расширения. Во-вторых, 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.

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