【发布时间】:2020-02-19 18:48:44
【问题描述】:
我是 Kotlin 的初学者。 我最熟悉 Python,在进入 Kotlin 之前,我刚刚通读了基本的 Java 教程https://docs.oracle.com/javase/tutorial/java/index.html。
在阅读 Kotlin 文档的这一部分时,我想到了一个问题
https://kotlinlang.org/docs/reference/basic-types.html#explicit-conversions
我从文档的上述部分了解到的是:
- 对于赋值
=,会发生隐式类型转换。如果左侧的类型是超类型或右侧类型的相同类型,则代码将编译。否则就是编译错误。对于Int和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 找到源代码, 但这里只声明了函数,但没有实现。我在哪里可以找到实现?
看来操作重载实际上并没有进行类型转换。我们是否只是实现了所有可能的同名但参数类型签名不同的函数,从而推断出类型,然后选择具有匹配签名的函数?
还有一个普遍的问题:在 Kotlin 中,究竟在哪些情况下会发生隐式转换?
【问题讨论】: