List<Integer> numbers = new ArrayList<>;
numbers.add(0); // <-- you use primitive, but in fact, JVM will convert this primitive to object.
numbers.add(new Integer(0)); // <-- We don't need do that.
val a: Int = 10000
println(a === a) // Prints 'true'
val boxedA: Int? = a
val anotherBoxedA: Int? = a
println(boxedA === anotherBoxedA) // !!!Prints 'false'!!!
注解“===”用于比较参考......。 另一方面,它保持了平等:
val a: Int = 10000
println(a == a) // Prints 'true'
val boxedA: Int? = a
val anotherBoxedA: Int? = a
println(boxedA == anotherBoxedA) // Prints 'true'
4条答案
按热度按时间e4yzc0pl1#
不...是的。
Kotlin没有primitive类型(我的意思是你不能直接声明primitive)。它使用
Int
,Float
等类作为primitive的对象 Package 器。当Kotlin代码转换为jvm代码时,只要有可能,“primitive object”就会转换为java primitive。在某些情况下,这是无法完成的。这些情况是,例如,“primitive”的集合。例如,
List<Int>
不能包含primitive。因此,编译器知道何时可以将object转换为primitive。而且,它与java非常相似:另外,当你声明“nullable primitive”时,它永远不会被转换为primitive(这是很明显的,因为primitive不能为null)。在java中,它的工作原理非常相似:
还有一件事-医生们怎么说?
对于通用、JVM、JS
表示32位有符号整数。在JVM上,此类型的不可为空值表示为基本类型int的值。
对于本地
表示32位有符号整数。
@见:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html
所以,最后一个结论。Kotlin没有开箱即用的原始类型。你把所有的对象都当作对象。转换到原始类型是在比代码更低的层次上完成的。这种设计是为了保持与JVM的兼容性。
我做了一点深入的研究,并发表在媒体上。对于感兴趣的:https://medium.com/@przemek.materna/kotlin-is-not-primitive-primitives-in-kotlin-and-java-f35713fda5cd
ru9i0ody2#
简短回答-是,取决于声明。
关于https://www.youtube.com/watch?v=Ta5wBJsC39s有一个非常有用的视频
jgzswidk3#
在Java平台上,数字在物理上存储为JVM基本类型,除非我们需要一个可空的数字引用(例如Int?)或涉及泛型。在后一种情况下,数字被装箱。
请注意,数字的装箱不一定保留同一性:
注解“===”用于比较参考......。
另一方面,它保持了平等:
5n0oy7gb4#
Document say(对于Int类型):
对于Common、JVM、JS:“表示32位有符号整数。在JVM上,此类型的不可为空值表示为基本类型int的值。”
对于本机:“表示32位有符号整数。”
我对它进行了测试(我认为这些代码运行在jvm上),你可以在这些图片中看到结果,float、double和其他数据类型的结果都是类似的。