【发布时间】:2022-01-10 10:49:00
【问题描述】:
有什么区别
inline fun <reified T> T.TAG(): String = T::class.java.simpleName
和
fun Any.TAG(): String = this::class.java.simpleName
使用泛型和 Any 作为函数参数或扩展函数类名有什么区别吗?
【问题讨论】:
有什么区别
inline fun <reified T> T.TAG(): String = T::class.java.simpleName
和
fun Any.TAG(): String = this::class.java.simpleName
使用泛型和 Any 作为函数参数或扩展函数类名有什么区别吗?
【问题讨论】:
有区别。
inline fun <reified T> T.TAG1(): String = T::class.java.simpleName
fun Any.TAG2(): String = this::class.java.simpleName
TAG1 将获得 compile-time 类型,因为 T 的类型在编译时确定,TAG2 将获得运行时类型。 this::class 类似于 Java 中的 this.getClass()。
例如:
val x: Any = "Foo"
x.TAG1() 会给你Any::class.java.simpleName,x.TAG2() 会给你String::class.java.simpleName。
【讨论】:
listOf<Int>() 将给出List 和EmptyList。 listOf<Int>(1) 将提供 List 和 SingletonList。 listOf<Int>(1, 2) 将提供 List 和 ArrayList。