Kotlin有原始类型吗?

zengzsys  于 2023-04-12  发布在  Kotlin
关注(0)|答案(4)|浏览(177)

Kotlin有原始类型吗?当我声明变量时:val myAge: Int = 18那么myAge变量存储的实际值是18还是存储内存中对象的地址?。如果Int是原始类型,那么为什么我们可以像myAge.minus(10)一样使用它的方法?

e4yzc0pl

e4yzc0pl1#

不...是的。
Kotlin没有primitive类型(我的意思是你不能直接声明primitive)。它使用IntFloat等类作为primitive的对象 Package 器。
当Kotlin代码转换为jvm代码时,只要有可能,“primitive object”就会转换为java primitive。在某些情况下,这是无法完成的。这些情况是,例如,“primitive”的集合。例如,List<Int>不能包含primitive。因此,编译器知道何时可以将object转换为primitive。而且,它与java非常相似:

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.

另外,当你声明“nullable primitive”时,它永远不会被转换为primitive(这是很明显的,因为primitive不能为null)。在java中,它的工作原理非常相似:

int k = null; // No way!
Integer kN = null; // That's OK.

还有一件事-医生们怎么说?
对于通用、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

ru9i0ody

ru9i0ody2#

简短回答-,取决于声明。

val myAge: Int = 18           // this is primitive
val myAge2: Int? = 18         // this is not

关于https://www.youtube.com/watch?v=Ta5wBJsC39s有一个非常有用的视频

jgzswidk

jgzswidk3#

在Java平台上,数字在物理上存储为JVM基本类型,除非我们需要一个可空的数字引用(例如Int?)或涉及泛型。在后一种情况下,数字被装箱。
请注意,数字的装箱不一定保留同一性:

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'
5n0oy7gb

5n0oy7gb4#

Document say(对于Int类型):
对于Common、JVM、JS:“表示32位有符号整数。在JVM上,此类型的不可为空值表示为基本类型int的值。”
对于本机:“表示32位有符号整数。”
我对它进行了测试(我认为这些代码运行在jvm上),你可以在这些图片中看到结果,float、double和其他数据类型的结果都是类似的。

相关问题