为什么可空数字不保存身份

kotlin nullable价值观不是保存身份而是平等,

 val a: Int = 10000 val boxedA: Int? = a val anotherBoxedA: Int? = a print(boxedA === anotherBoxedA) // !!!Prints 'false'!!! print(boxedA == anotherBoxedA) // Prints 'true' 

我只是想知道为什么这是不同的?

4 Solutions collect form web for “为什么可空数字不保存身份”

a === b当且仅当a和b指向同一个对象时才计算为真。

boxedA === anotherBoxedA.不是这样的boxedA === anotherBoxedA.

Kotlin – 平等

这个代码示例旁边的文档中解释了这一点:

请注意,装箱数字不一定保留身份

基本上,使用可空的Int? types强制编译器在生成的字节码中使用盒装的Integertypes来代替原始的int 。 所以代码示例转换为这个Java代码:

 int a = 10000; Integer boxedA = Integer.valueOf(a); Integer anotherBoxedA = Integer.valueOf(a); System.out.print(boxedA == anotherBoxedA); 

这当然会打印false ,因为两个Integer.valueOf调用已经创建了两个不同的Integer实例。 以为JVM对Integer.valueOf调用创建的实例有缓存, 它只能在-128到127之间工作 – 如果你运行的代码有a在该范围内的值,那么这两个比较确实会返回true

引用相等意味着两个引用指向同一个对象。

Document ,通过===操作(和它的否定对象!==)检查引用相等性。 a === b当且仅当a和b指向同一个对象时才计算为真。

在科特林,我们有两个不同的平等观念, 指称平等结构平等

引用平等

我们使用===符号,它允许我们评估一个对象的引用(如果它指向同一个对象)。 这在java中是相当于“==”的运算符。 多数民众赞成为什么boxedA === anotherBoxedA返回false(因为他们是两个单独的对象,每个指向内存中的不同位置)。

结构平等

我们使用==符号来评估两个值是否相同(或相等)。 这通常是通过在java中实现equals()方法来实现的。 这就是为什么boxedA == anotherBoxedA它返回true

  • 将kotlin转换为java后,Notnullvariables可以为空
  • 在Kotlin文件的主要方法中,android studio“error:can not find or load main class”
  • 使用Kotlin的“let”的合理情况
  • Datepicker:如何在点击edittext时popupdatepicker
  • 构造器在kotlin派生类中的可分解构造器
  • Kotlin + Dagger2:不能提供没有@Inject构造函数或从@提供或@产生注释的方法
  • 如何检测Data class Kotlin中更改的值?
  • Android数据绑定和Kotlin
  • @用AndoridInjector和Kotlin在SubComponent中提供方法
  • 安子的主题和风格
  • 为什么平台types不匹配nonnull对象
  • Kotlin language will be the best programming language for Android.