(Вот другой подход.)
Рассмотрим обычную неуниверсальную функцию:
fun myFun(a: Int, b: String) {
// …use a and b…
}
Что такое a
и b
?Они еще ничего не значат.Они просто говорят: «Когда вы вызываете эту функцию, вы должны передать эти значения».Вы ожидаете, что тело функции будет ссылаться на них каким-то образом;вот когда они привыкнут.
Теперь рассмотрим универсальную функцию:
fun <T, U> myFun(/* …use T and U… */) {
// …
}
То же самое с T
и U
.Это тоже параметры - type parameters.Как и в случае с параметрами-значениями, объявление параметров типа само по себе ничего не значит, но дает заполнители для типов, которые должны быть переданы (явным образом или выведены) при вызове функции.(Объявление <…>
также дает возможность указать любые ограничения или дисперсию, например, <T : Number>
или <out T>
.) И вы обычно будете использовать эти параметры типа позже - в этом случае, в остальной части сигнатуры функции.