#kotlin #generics
Вопрос:
Я хочу написать функцию, которая преобразует пару целых чисел в пару BigInteger
. Допустимыми типами параметров являются Int
, Long
, и BigInteger
:
fun <A, B> foo(a: A, b: B) {
val x = if (a is BigInteger) a else a.toBigInteger()
val y = if (b is BigInteger) b else b.toBigInteger()
return Pair(x, y)
}
Можно ли сообщить компилятору Kotlin, что A
и B
должно быть в наборе Int
, Long
, BigInteger
?
Комментарии:
1. Каков именно ваш вариант использования для этого? Поскольку нет другого места, где вы могли бы иметь ссылку типа «Int или Long», в чем преимущество этой функции по сравнению с простым преобразованием
BigInteger
на сайте вызова, когда это необходимо? Я бы уже нашелPair(bigInt, someLong.toBigInteger())
довольно ясным2. @Джоффри, Вы правы, мы можем сделать конвертацию на сайте звонков, но я просто искал более дружественный интерфейс. И вопрос не только в этом конкретном случае, но и в общих ограничениях языка.
Ответ №1:
К сожалению, я не думаю, что в настоящее время это возможно или было бы достаточно полезно для них, чтобы рассмотреть возможность его реализации. Я не смог найти какого-либо конкретного упоминания об отсутствии поддержки, но в документации по (нескольким) верхним границам говорится, что:
Переданный тип должен удовлетворять всем условиям предложения where одновременно. В приведенном выше примере тип T должен реализовывать как последовательность символов, так и сопоставимость.
Единственным чистым решением, вероятно , будет перегрузка, однако это приведет к большому дублированию, если вы разрешите какие-либо комбинации Int
и Long
т. Д.
Комментарии:
1. Спасибо, похоже, перегрузка-это самое чистое решение.