kotlin - 这个 kotlin 代码是如何工作的?

标签 kotlin

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 的单独实现
  • 成员(member) length是一个没有赋值的 val。这是如何编译的?它需要是一个 lateinit var

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

    请随时使用更贴切的标题编辑此问题。

    最佳答案

    基本上,kotlin.Stringmapped 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/

    相关文章:

    clojure - 如何在 Kotlin 中运行 Clojure?

    android - Kotlin Android 中的 OKhttp 自签名证书

    java - Volley : Kotlin Class call from JavaCode

    android - 在 PagedListAdapter 中未调用 onCreateViewHolder

    java - 我如何在 Kotlin 中使用非静态方法?

    android - View 绑定(bind)出现错误 : incompatible with attribute android:visibility

    android - GridLayout 共享元素转换无法正常工作

    android - SparseArray 错误 : Call requires API level S

    java - 使用 Kotlin 创建自定义 Dagger 2 范围

    android - 如何使用Retrofit进行同步调用