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:什么情况下会发生隐式转换? 的相关文章

  • 让协程等待之前的调用

    我还没有完全掌握 Kotlin 协程 基本上我希望协程在执行之前等待任何先前的调用完成 下面的代码似乎可以工作 但它正在做我认为它正在做的事情吗 private var saveJob Job null fun save saveJob s
  • 将 Powershell 输出转换为 Markdown 文件

    我有以下代码 xmlFile C Users kraer Desktop bom xml xml xml Get Content xmlFile xml bom components component ForEach Object fin
  • kotlin 从数组中获取随机字符串

    刚接触 kotlin 有不少问题和解答 大部分是 Java 方面的 在遵循文档并针对大量 SO 进行验证之后问题和答案 https stackoverflow com questions 6726963 random string from
  • 在 Jetpack Compose 中启动动画矢量 Drawable

    我有一个动画矢量可绘制R drawable my anim 我想在 Jetpack Compose 中展示并开始 可绘制对象显示 渲染正确 但动画未启动 这是撰写视图 Composable fun SplashView Surface mo
  • 如何在 Kotlin 中强制执行空的非空字符串?

    我经常想保存一个不能为空的字符串or blank 空白不够好 编译器处理String 很好地防止 null 我们可以使用aNullableString isNullOrBlank 检查它是否为空或空白 但是 这要求在使用空白支票的所有地方都
  • 我收到“循环依赖”Android Dagger Hilt 错误

    我从头开始检查了所有内容 但找不到错误 我找不到错误 可能是什么 我收到以下编译错误 HomeViewModel java 6 error ComponentProcessor MiscError dagger internal codeg
  • “_Smi”不是“bool”类型的子类型 - Flutter MethodChannel

    收到这个奇怪的错误 似乎 MethodChannel 正在转换为 int 而不是 bool 06 07 00 16 26 589 3678 4993 E flutter ERROR topaz lib tonic logging dart
  • Kotlin 反射不可用

    我试图从第一个例子中学习高阶函数video https www youtube com watch v a7QpoMj2uIA 这是我的代码和输出 Code fun lowercase value String value toLowerC
  • Kotlin:如何修改对中的值? [复制]

    这个问题在这里已经有答案了 为什么我无法更改该对中的值 var p Pair
  • 找不到具有不同构建变量的包名称“....”的匹配客户端

    我想实现推送通知 我添加到项目级别 dependencies classpath com android tools build gradle 2 2 2 classpath com google gms google services 3
  • Kotlin 等价于三元运算符 [重复]

    这个问题在这里已经有答案了 因此 在 java 中 我们有三元运算符 它有时对于简化 if else 内联计算的某些值很有用 例如 myAdapter setAdapterItems textToSearch length 0 noteLi
  • Python从int到string的快速转换

    我正在用 python 求解大量阶乘 并发现当我完成计算阶乘时 需要相同的时间才能转换为字符串以保存到文件中 我试图找到一种将 int 转换为字符串的快速方法 我将举一个计算和 int 转换时间的例子 我正在使用通用的 a str a 但感
  • java.lang.AssertionError:CALL 'public final fun

    我正在尝试使用 jetPack Compose 制作一个项目 我拥有它工作所需的所有必要依赖项 但是当我运行我的应用程序时 它会抛出一个错误 我找不到解决方案 这是错误 java lang AssertionError CALL publi
  • 如何在 LazyColumn 底部添加空白区域?

    我想添加 LazyColumn 的空白底部 并且我想允许用户调出底部元素 我怎样才能实现这个 Example LazyColumn modifier Modifier fillMaxWidth height 300 dp border 2
  • 如何修复 Kotlin JobCancellationException?

    由于 Kotlin JobCancellationException 我发生了崩溃 以下是有关崩溃的详细信息 kotlinx coroutines JobCancellationException Job was cancelled job
  • 如何在 Kotlin 中将 List 转换为 Map?

    例如 我有一个字符串列表 例如 val list listOf a b c d 我想将其转换为地图 其中字符串是键 我知道我应该使用 toMap 函数 但我不知道如何实现 也没有看到任何例子 你有两个选择 第一个也是性能最高的是使用asso
  • 为什么 jetpack-compose 状态提升使用回调?

    本教程 https developer android com codelabs jetpack compose basics 7关于 jetpack compose 中的状态提升说 通过向 OnboardingScreen 传递函数而不是
  • 列出 J 中数字的数字

    我使用的编程语言 J 我想将一个数字的所有数字放入一个列表中 From 12345 to 1 2 3 4 5 我能做些什么 我写这个的方式是 10 1 我们可以看到它与这句话的使用 10 1 123456789 1 2 3 4 5 6 7
  • 如何在 Android 应用程序中每天重复一个操作?

    我每天都想重复一个动作 即使应用程序未运行或设备已重新启动 重新启动 它也必须继续工作 在我的代码中 我尝试每 1 分钟显示一条 TOAST 消息 作为测试 它在模拟器中工作正常 但在真实设备上不起作用 我尝试对修复进行一些更改 正如我在一
  • 在 Swift 中将 Int 转换为 UInt32

    我正在制作一个 Tcp 客户端 因此使用CFStreamCreatePairWithSocketToHost它期望第二个参数为 UInt32 这是我正在尝试做的事情的示例 func initNetwork IP String Port In

随机推荐