Котлин: как объявить универсальную функцию с фиксированным набором допустимых параметров типа?

#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. Спасибо, похоже, перегрузка-это самое чистое решение.