Я ищу, чтобы перегрузить оператор деления «/», но хотел бы указать, чтобы общий тип указывался для указания типа возвращаемого значения.
Вот пример:
inline operator fun <reified T> MyType.div(fieldName: String): T { val value = someFunction(fieldName) return convertToExpectedValue(value) }
К сожалению, я не могу понять, как явно указать общий тип T, когда его невозможно вывести. Мне интересно, будет ли что-то вроде следующего, что будет работать?
val stringVal = myType /<MyType> "myField" /<String> "myStringField"
Обратите внимание, что я знаю, что
myType.div<String>("blah")
работает. Я ищу что-то, что использует оператор «/».
Вам нужно будет использовать промежуточную переменную или (с Kotlin 1.2) as
:
val midVal: MyType = myType / "myField" val stringVal: String = midVal / "myStringField" // or with Kotlin 1.2 // I'm not 100% sure about this one actually, so take this with a grain of salt val stringVal = ((myType / "myField") as MyType / "myStringField") as String
В конце концов, ответ, в конечном счете, не может быть выполнен.
Я решил пойти с переопределением (), чтобы получить общий тип. Я также добавил версию без общего типа, которая явно возвращает «MyType», так что цепочка вызовов будет работать с общим типом, который нужен только в конце.
Итак, теперь это выглядит так:
val stringVal = myType("fieldName")<String>("myStringField")
с кодом определения функции:
inline operator fun <reified T> MyType.invoke(fieldName: String): T { val value = someFunction(fieldName) return convertToExpectedValue(value) } operator fun MyType.invoke(fieldName: String): MyType { return someFunction(fieldName) as MyType }