gpt4 book ai didi

Kotlin:在哪些情况下会发生隐式转换?

转载 作者:行者123 更新时间:2023-12-02 13:44:23 28 4
gpt4 key购买 nike

我是 Kotlin 的初学者。
我对 Python 最熟悉,我刚刚通读了基本的 Java 教程 https://docs.oracle.com/javase/tutorial/java/index.html在进入 Kotlin 之前。

在阅读 Kotlin 文档的这一部分时,我想到了一个问题

https://kotlinlang.org/docs/reference/basic-types.html#explicit-conversions

我从文档的上述部分了解到的是:

  • 作业 = , 隐式类型转换发生。如果左侧的类型是父类(super class)型或右侧类型的相同类型,则代码将编译。否则就是编译错误。如果是 IntLong ,它们都是 Number 的子类型但它们都不是彼此的子类型,因此隐式转换不起作用。因此,我们需要使用 .toLong() 或 .toInt() 等方法来显式转换它们。

  • 然后当我读到这部分

    val l = 1L + 3 // Long + Int => Long


    我开始想知道在这种情况下是否会发生隐式类型转换。

    文档说这与运算符重载有关。
    这个运算符重载是如何在后台实现的?
    我试图在 Github https://github.com/JetBrains/kotlin/blob/master/core/builtins/native/kotlin/Primitives.kt 找到源代码,
    但这里只声明了函数,但没有实现。我在哪里可以找到实现?

    似乎操作重载实际上并没有执行类型转换。我们是否只是实现了所有可能的具有相同名称但参数类型签名不同的函数,以便推断类型,然后选择具有匹配签名的函数?

    还有一个普遍的问题:在 Kotlin 中,隐式转换到底发生在哪些情况下?

    最佳答案

    For assignments =, implicit type conversion happens. If the lefthand side's type is a supertype or same type of righthand side's type the code would compile.



    作业在这方面并不特别。更一般地,如果表达式的预期类型是父类(super class)型或与实际类型相同,则代码编译;只是赋值右侧的预期类型是左侧的类型。我不会说插入了隐式转换,但是如果您这样看,我认为不会有任何问题。

    Do we just implementing all possible functions with same name but different parameter type signatures, so that the type is inferred, then the function with the matching signature is selected?



    是的,完全正确(对于这种情况)。如果要支持原始类型,则需要为所有这些类型提供重载。

    所以 1L + 3就解析和类型检查而言,它只是一个方法调用(具体为 `Long.plus(Int): Long),不涉及隐式转换。但是这些方法内置在编译器中以进行特殊处理,这就是您看不到实现的原因。

    变成两个 bytecode说明 i2l (“将 int 转换为 long”)和 ladd (“添加两个多头”),但这不是你应该关心的事情,或者很长一段时间。

    And the general question: In Kotlin, exactly at which situations does implicit conversion happen?



    Smart casts是最接近 Kotlin 的隐式转换,但它们与其他语言中的 i.c.s 有很大不同,我不会使用这个名称。所以我会说永远不会。

    关于Kotlin:在哪些情况下会发生隐式转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60295835/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com