Kotlin 有原始类型吗?当我声明变量:
val myAge: Int = 18
时,myAge
变量存储实际值是18
或存储对象在内存中的地址?。如果 Int
是原始类型,那么为什么我们可以像 myAge.minus(10)
一样使用它的方法?
不...是的。
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
简短回答 - 是,取决于声明。
val myAge: Int = 18 // this is primitive
val myAge2: Int? = 18 // this is not
有一个关于此的信息非常丰富的视频 https://www.youtube.com/watch?v=Ta5wBJsC39s
在 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'