此Kotlin代码如何工作?

时间:2018-07-16 19:04:45

标签: kotlin

Kotlin定义了自己的String类:

public class String : Comparable<String>, CharSequence {
    companion object {}        
    public operator fun plus(other: Any?): String    
    public override val length: Int    
    public override fun get(index: Int): Char    
    public override fun subSequence(startIndex: Int, endIndex: Int): CharSequence    
    public override fun compareTo(other: String): Int
}

此类的实例是通过StringsJVM.kt中定义的内联函数构造的:

public inline fun String(bytes: ByteArray, offset: Int, length: Int): String =
    java.lang.String(bytes, offset, length, Charsets.UTF_8) as String

问题:

  1. java.lang.Stringkotlin.String的投射如何工作?它不是子类型,而是CharSequence
  2. 的单独实现
  3. 成员length是一个未分配值的val。如何编译?它应该是一个Lateinit var

我认为在编译之前必须进行某种类型的代码预处理。

请随时使用更恰当的标题来编辑此问题。

1 个答案:

答案 0 :(得分:2)

基本上,kotlin.String是一个mapped type,这意味着当编译为JVM字节码时,所有kotlin.String类型的Kotlin用法都将转换为{{1} }。

这项技术可确保Kotlin和Java类型的兼容性,同时允许将Kotlin-idiomatic API添加到Java类型。

您可以inspect the *.class files由编译器生成,并看到它们提到了java.lang.String

另请参阅:a sililar Q&A


关于java.lang.String定义的length属性的编译,根据the Gradle build script的描述,您可以看到它实际上从未编译过,而只是序列化到Kotlin内置元数据中相应的模块。