Компилятор изо всех сил старается подогнать параметры, которые вы указали в сигнатуре функции.В этом случае он выводит параметры типа Any
и Int
, поэтому он в основном вызывает функцию, подобную этой, что, конечно, удовлетворяет требованию верхней границы, потому что Any
является супертипом Int
:
foo<Any, Int>("bar", 123)
Вы можете убедиться, что это действительно то, что происходит, по крайней мере, двумя различными способами.
Вы можете открыть намеренные действия ( Alt + Enter в Windows, 101 в macOS), когда курсор находится на вызове функции foo
и выберите Add explicit type arguments
.Это создаст строку выше.
Вы можете сделать функцию reified
и распечатать классы параметров типа - это будут те параметры, о которых она знаетво время компиляции.
inline fun <reified T, reified U: T> foo(a: T, b: U) {
println("$a $b")
println(T::class) // class kotlin.Any
println(U::class) // class kotlin.Int
}