Kotlin 文档中的术语 "Changing type from unsigned type to signed counterpart (and vice versa) is a binary incompatible change" 是什么意思?

What does the term "Changing type from unsigned type to signed counterpart (and vice versa) is a binary incompatible change" in Kotlin documentation?

我是 Kotlin 的真正初学者,我想知道以下术语在 Kotlin documentation 中的含义。

Changing type from unsigned type to signed counterpart (and vice versa) is a binary incompatible change.

事实上,我已经阅读了有关 binary compatibility 的内容,但作为初学者,我在这里要求提供示例以直观地理解 Kotlin 中的二进制兼容性。

如果我在不同机器上用 Kotlin 编写的 class、包或程序中使用这样的代码,会发生什么情况?

vaL a: UInt = 10000 
val b: Int = a.toInt()

或者这样的代码

vaL a: Int = 10000 
val b: UInt = a.toUInt()

What will occur if I use a code like this in a class, package or program written in Kotlin in different machines?

您在此处提供的代码应该在每台机器上都能正常工作,即使您只在一台机器上编译一次也是如此。这当然是假设您正在为 JVM 目标(非本机)编译此 Kotlin 代码。

当谈到二进制兼容或不兼容的更改时,人们通常指的是开发人员对代码所做的更改,而不是代码执行的转换。此外,它指的是对编译单元的 public API 所做的更改,而不是内部实现代码的更改,也不是 运行 在不同机器上使用相同的编译代码。

所以这篇文档没有提到 Int<->UInt conversionstoInt()toUInt() 方法调用。相反,它指的是更改 源代码中的 某些东西的类型 public,例如 public 函数的参数或 return 值(从有符号到未签名,反之亦然)。

例如,假设您创建了一个具有以下函数的库:

fun printMyNumber(n: Int) {
    println(n)
}

发布后,如果您决定将 n 的类型从 Int 更改为 UInt,这是 二进制不兼容改变。

这意味着,如果您 运行 使用类路径中的新版本库调用此函数,则针对您的库的先前版本编译的任何代码片段都将失败。如果用户希望它正常工作,则必须针对您的新版本的库重新编译他们的项目。

这样解释时,似乎问题不大,因为升级项目中的库很可能意味着无论如何都要重新编译项目。当混合中存在传递依赖时,就会出现主要问题。例如,假设以下依赖关系图:

project A
  \_ library B
  |    \_ library C (v1)
  \_ library D
       \_ library C (v2)

一般来说,这意味着库 C 的 v2 将在项目中得到有效使用。如果库 C 在 v2 中引入了二进制不兼容的更改,您可能会遇到问题,因为库 B 是针对库 C 的 v1 编译的,并且如果它尝试调用像我上面的示例中那样更改的函数,将会失败。