#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 Ну, на самом деле все зависит от того, чего ты хочешь. Если вам нужен тип времени компиляции, то, конечно, использование дженериков даст вам это.