Kotlin 定义了自己的 String
类(class):
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
的 Actor 阵容如何?至kotlin.String
工作?它不是子类型,而是 CharSequence
的单独实现length
是一个没有赋值的 val。这是如何编译的?它需要是一个 lateinit var 我认为在编译之前必须进行某种代码预处理。
请随时使用更贴切的标题编辑此问题。
最佳答案
基本上,kotlin.String
是 mapped type ,这意味着,当编译成 JVM 字节码时,kotlin.String
的所有 Kotlin 用法类型被转换为 java.lang.String
的等效用法.
此技术确保 Kotlin 和 Java 类型的兼容性,同时允许将 Kotlin 惯用 API 添加到 Java 类型。
您可以inspect the *.class
files由编译器生成,并看到他们提到了 java.lang.String
.
另见:a sililar Q&A .
关于length
的编译kotlin.String
的属性(property)根据 the Gradle build script 的定义,您可以看到它实际上从未被编译,而只是序列化为 Kotlin 内置元数据。对应的模块。
关于kotlin - 这个 kotlin 代码是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51368579/