Kotlin 有原始类型吗?

问题描述 投票:0回答:4

Kotlin 有原始类型吗?当我声明变量:

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

Image source: stackoverflow.com

kotlin primitive-types reference-type
4个回答
39
投票

不...是的。

Kotlin 没有原始类型(我的意思是你不能直接声明原始类型)。它使用

Int
Float
等类作为基元的对象包装器。

当 kotlin 代码转换为 JVM 代码时,只要有可能,“原始对象”就会转换为 java 原语。 在某些情况下,这是无法完成的。例如,这些情况是“基元”的集合。例如,

List<Int>
不能包含基元。因此,编译器知道何时可以将对象转换为基元。而且,它与 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.

此外,当您声明“可空原语”时,它永远不会转换为原语(这很明显,因为原语不能是

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的兼容性。

我做了一些深入的研究并将其发布在 Medium 上。有兴趣的:https://medium.com/@przemek.materna/kotlin-is-not-primitive-primitives-in-kotlin-and-java-f35713fda5cd


18
投票

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

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

有一个关于此的信息非常丰富的视频 https://www.youtube.com/watch?v=Ta5wBJsC39s


1
投票

在 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'

0
投票

文档说(对于 Int 类型):

对于 Common、JVM、JS: “表示 32 位有符号整数。在 JVM 上,这种类型的不可空值表示为基本类型 int 的值。”

对于本地人: “表示一个 32 位有符号整数。”

我测试了它(我认为这些代码在jvm上运行),你可以在这些图像中看到结果。对于浮点型、双精度型和其他数据类型,结果类似。

© www.soinside.com 2019 - 2024. All rights reserved.