Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does Kotlin have primitive types?

Does Kotlin have primitive types?. When I declare the variable: val myAge: Int = 18 then the myAge variable stores the actual values is 18 or stores the addresses of the objects in the memory?. If Int is primitive type then why we can use its method like myAge.minus(10)?

Image source: stackoverflow.com

like image 753
Minh Nguyen Avatar asked Aug 08 '19 08:08

Minh Nguyen


People also ask

Does Kotlin support primitive datatypes like Java?

The most fundamental data type in Kotlin is the Primitive data type and all others are reference types like array and string. Java needs to use wrappers (java. lang. Integer) for primitive data types to behave like objects but Kotlin already has all data types as objects.

Does Kotlin have types?

There are two types: Float and Double . If you don't specify the type for a numeric variable, it is most often returned as Int for whole numbers and Double for floating point numbers.

What is primitive and non primitive data type in Kotlin?

Values can be of two types. One of them is a primitive. Number of them is limited: byte , short , int , long , float , double , boolean , char . Those values act on JVM somehow different than reference types. They are put on stack as value.

Is boolean a primitive data type in Kotlin?

In Kotlin the boolean data type is a primitive data type having one of two values: true or false .


2 Answers

No... and yes.

Kotlin doesn't have primitive type (I mean you cannot declare primitive directly). It uses classes like Int, Float as an object wrapper for primitives.

When kotlin code is converted to jvm code, whenever possible, "primitive object" is converted to java primitive. In some cases this cannot be done. Those cases are, for example, collection of "primitives". For example, List<Int> cannot contains primitive. So, compiler knows when it can convert object to primitive. And, again, it's very similar to 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.

Also, when you declare "nullable primitive" it is never converted to primitive (what is kind of obvious, as primitive cannot be null). In java it works very similar:

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

One more thing - what docs are saying about it?

For Common, JVM, JS

Represents a 32-bit signed integer. On the JVM, non-nullable values of this type are represented as values of the primitive type int.

For Native

Represents a 32-bit signed integer.

@see: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html

So, the last conclusion. Kotlin doesn't have primitive types out of the box. You treat all objects like objects. Converting to primitive is done at some lower level than code. This design is caused to keep compatibility with JVM.

I did a little deep dive and published it on medium. For interested: https://medium.com/@przemek.materna/kotlin-is-not-primitive-primitives-in-kotlin-and-java-f35713fda5cd

like image 124
Cililing Avatar answered Oct 06 '22 10:10

Cililing


Short answer - yes and depends on the declaration.

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

There's a very informative video about that https://www.youtube.com/watch?v=Ta5wBJsC39s

like image 33
Demigod Avatar answered Oct 06 '22 09:10

Demigod