Литеральный синтаксис класса для параметризованных классов в Котлине

Я пытаюсь высмеять функцию в Kotlin

Mockito.mock(Function2<Int, Int, Unit>::class.java)

и он говорит: "Только классы разрешены в левой части литерала класса". Каков правильный способ получить ссылку на статически известный параметризованный класс? На данный момент я живу с уродливым литом

Mockito.mock(Function2::class.java) as (Int, Int) -> Unit

Ответы

Ответ 1

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

Там есть обходное решение: если вы используете синтаксис литерала класса через параметр типа reified, подставляя его на нужный тип на сайте вызова, вы получите тот же объект KClass, но с фактическими аргументами, которые вы используете предоставлена. В вашем случае вы можете объявить следующую функцию:

inline fun <reified T : Any> mock(): T = Mockito.mock(T::class.java) as T

И используйте его следующим образом:

val f = mock<(Int, Int) -> Unit>()