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
conversions 像 toInt()
或 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 编译的,并且如果它尝试调用像我上面的示例中那样更改的函数,将会失败。
我是 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
conversions 像 toInt()
或 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 编译的,并且如果它尝试调用像我上面的示例中那样更改的函数,将会失败。