Универсальный по сравнению с любой функцией в Kotlin

#kotlin #generics #any

#котлин #дженерики #Любой

Вопрос:

В чем разница между

 inline fun lt;reified Tgt; T.TAG(): String = T::class.java.simpleName  

и

 fun Any.TAG(): String = this::class.java.simpleName  

есть ли какая-либо разница между использованием универсального и любого в качестве параметра функции или в качестве расширенного имени класса функций?

Ответ №1:

Есть разница.

 inline fun lt;reified Tgt; T.TAG1(): String = T::class.java.simpleName fun Any.TAG2(): String = this::class.java.simpleName  

TAG1 получит тип времени компиляции, как тип T определяется во время компиляции, и TAG2 получит тип времени выполнения. this::class это похоже this.getClass() на Java.

Например:

 val x: Any = "Foo"  

x.TAG1() дал бы тебе Any::class.java.simpleName , и x.TAG2() дал бы тебе String::class.java.simpleName .

Комментарии:

1. еще несколько примеров: listOflt;Intgt;() приведу List и EmptyList . listOflt;Intgt;(1) даст List и SingletonList . listOflt;Intgt;(1, 2) даст List и ArrayList .

2. означает ли это, что использование универсального всегда лучше, чем использование любого другого?

3. @Jooo21 Ну, на самом деле все зависит от того, чего ты хочешь. Если вам нужен тип времени компиляции, то, конечно, использование дженериков даст вам это.