原始伴随常量和 java 包装器常量之间的区别

Difference between primitive companion constants and java wrapper constant

Kotlin重新定义了一些已经在Java中定义的原始常量,例如Long.MAX_VALUEDouble.NaN.

它们之间有什么区别?在使用 Kotlin 编写代码时应该首选哪个?

为了清楚起见,我指的是,例如:

kotlin.Long.Companion.MAX_VALUE
java.lang.Long.MAX_VALUE

Kotlin Long class(以及所有其他在 Java 中有对应项的)是包装器,这取决于类型是否可为空或不在内部表示值(在JVM)与int(原始,不可为空)或Integer(对象,可为空)。

看看here:

Represents a 64-bit signed integer.
On the JVM, non-nullable values of this type are represented as values of the primitive type long.

Kotlin 和 MAX_VALUE 的 Java 版本都是 9223372036854775807L,但由于 kotlin.Long 是一个包装器,它的实现可能会改变,这可能会改变 MAX_VALUE,所以最好坚持kotlin.Long.Companion.MAX_VALUE

这是一个普遍现象:Kotlin标准库的很大一部分与Java中的基本相同。这样

  1. Kotlin 可以提供更精确的类型:nullable 与 non-nullable 或 ListMutableList;

  2. 可以从 Kotlin-JS 或 Kotlin-Native 或其他未来的 Kotlin 实现访问库的这一部分。

出于这两个原因,请坚持使用 Kotlin 标准库类型和方法,除非您有某些特定需要使用 Java 类型和方法。

Long(和 Int 等)甚至是一种特殊情况,因为它们对应于不止一种 Java 类型:在某些情况下,它们最终会成为原始版本 (long),在其他版本中是盒装版本 (java.lang.Long)。您大多不关心 Kotlin 中的这种差异,因此有更好的理由继续使用 kotlin.Long.