Простая универсальная функция в Kotlin Fails - PullRequest
0 голосов
/ 12 июня 2019

Вот простая универсальная функция в Kotlin:

fun <T> twice(x: T) : T { return 2 * x }

Попытка построить это (либо в проекте, либо в REPL) приводит к следующим ошибкам:

error: none of the following functions can be called with the arguments supplied: 
public final operator fun times(other: Byte): Int defined in kotlin.Int
public final operator fun times(other: Double): Double defined in kotlin.Int
public final operator fun times(other: Float): Float defined in kotlin.Int
public final operator fun times(other: Int): Int defined in kotlin.Int
public final operator fun times(other: Long): Long defined in kotlin.Int
public final operator fun times(other: Short): Int defined in kotlin.Int
fun <T> twice(x: T) : T { return 2 * x }
                                   ^

Если я переключаюсьоператор возврата возвращает x * 2, сообщения об ошибках становятся следующими:

error: unresolved reference. None of the following candidates is applicable because of receiver type mismatch: 
@InlineOnly public inline operator fun BigDecimal.times(other: BigDecimal): BigDecimal defined in kotlin
@InlineOnly public inline operator fun BigInteger.times(other: BigInteger): BigInteger defined in kotlin
fun <T> twice(x: T) : T { return x * 2 }
                                   ^

Что мне здесь не хватает?

1 Ответ

2 голосов
/ 12 июня 2019

Поскольку T может быть чем угодно, компилятор не может найти соответствующий оператор times. Как видно из сообщения об ошибке, для Int доступно несколько альтернатив

public final operator fun times(other: Byte): Int defined in kotlin.Int
public final operator fun times(other: Double): Double defined in kotlin.Int
public final operator fun times(other: Float): Float defined in kotlin.Int
public final operator fun times(other: Int): Int defined in kotlin.Int
public final operator fun times(other: Long): Long defined in kotlin.Int
public final operator fun times(other: Short): Int defined in kotlin.Int

Но, к сожалению, нет общей функции times, которую можно использовать, например, с. Number. Боюсь, что в этом случае вам придется создать перегрузку для каждого типа, с которым вы хотите работать, то есть Double, Int и т. Д.

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