Kotlin:什么情况下会发生隐式转换?

2024-01-01

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

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

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

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

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

然后当我读到这部分时

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

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

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

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

一般问题是:在 Kotlin 中,隐式转换到底在什么情况下发生?


对于赋值=,会发生隐式类型转换。如果左侧类型是超类型或右侧类型的相同类型,则代码将编译。

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

我们是否只是实现具有相同名称但不同参数类型签名的所有可能函数,以便推断类型,然后选择具有匹配签名的函数?

是的,完全正确(对于本例)。如果您想支持原始类型,则需要为所有类型提供重载。

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

就变成了两个bytecode https://en.wikipedia.org/wiki/Java_bytecode_instruction_listings指示i2l(“将 int 转换为 long”)和ladd(“添加两个长整型”),但这可能不是您应该关心的事情,或者很长一段时间内都不应该关心的事情。

一般问题是:在 Kotlin 中,隐式转换到底在什么情况下发生?

智能施法 https://kotlinlang.org/docs/reference/typecasts.html#smart-casts是 Kotlin 与隐式转换最接近的类型,但它们与其他语言中的 i.c.s 有很大不同,因此我不会使用这个名称。所以我想说永远不会。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kotlin:什么情况下会发生隐式转换? 的相关文章

随机推荐