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

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属性与getter。 我可以不指定初始值吗?
  • 项目Onclick RecyclerView Kotllin Android
  • Android / Kotlin:未解决的参考:木材
  • Kotlin库项目失败的解决方案:[Lkotlin / reflect / KProperty
  • RealmResults大小正在返回零
  • 如何在android中创建动态布局
  • 我现在正在用Kotlin开发一个Android应用程序,但是发生了一个错误:CompilationException:无法将方法调用“readText”内联到
  • Java / Android / Kotlin:关于私人领域的反思和调用公共方法
  • Geofence不在Kotlin工作
  • 如何使用界面android在适配器中创建onclick事件?
  • 为什么我的应用程序只有在使用OpenFileInput / Ouput函数时将字符串直接赋值给代码时才起作用
  • Kotlin language will be the best programming language for Android.