假设我们有以下内容:
val person = "Bill"
Run Code Online (Sandbox Code Playgroud)
有人可以解释这两者之间的区别:
val kClass1 = person.javaClass.kotlin
Run Code Online (Sandbox Code Playgroud)
VS
val kClass2 = person::class
Run Code Online (Sandbox Code Playgroud)
当我应该打电话给那个而不是另一个?
任何源代码示例将不胜感激.
主要原因有两种方法可以实现同样的事情,即获取Kotlin类的一个对象,是因为在Kotlin 1.1之前,::class
文字不支持左侧的表达式.因此,如果您使用的是Kotlin 1.0,那么您唯一的选择就是.javaClass.kotlin
,否则您对其中任何一个都没问题.这就是"Kotlin in Action"使用.javaClass.kotlin
语法的原因:它是在Kotlin 1.1发布之前编写的.
这些表达式的类型也有细微差别.例如,在以下代码中
interface T
fun f1(x: T) = x::class
fun f2(x: T) = x.javaClass.kotlin
Run Code Online (Sandbox Code Playgroud)
f1
的类型是KClass<out T>
,但是f2
类型是KClass<T>
.这实际上是javaClass
声明中的疏忽:KClass<out T>
在这种情况下更正确,因为x
类不一定T
,但也可以是子类T
.
否则,这两个表达式(x.javaClass.kotlin
和x::class
)在生成的字节码和运行时性能方面完全相同.我更喜欢,x::class
因为它更短,读起来更好.
归档时间: |
|
查看次数: |
2253 次 |
最近记录: |