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
问题:
java.lang.String
到kotlin.String
的投射如何工作?它不是子类型,而是CharSequence
length
是一个未分配值的val。如何编译?它应该是一个Lateinit var 我认为在编译之前必须进行某种类型的代码预处理。
请随时使用更恰当的标题来编辑此问题。
答案 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内置元数据中相应的模块。