Reputation: 359
Can anyone please explain why doing this in Kotlin is impossible?
val x :Int? = 123
val y :Any = x
I come from .NET background where Nullable type is assignable to Object type, but how are they different?
Upvotes: 4
Views: 5560
Reputation: 37849
Nullable types are not subtypes of Any
, but they are subtypes of Any?
.
Any
is only a superclass of non-nullable types. This makes it possible to write code that requires a non-null instance of anything, and still benefit from the safety of the type-checker (unlike when using Java's Object
).
Here is an image that can help:
The following code is a valid replacement of yours:
val x: Int? = 123
val y: Any? = x
Upvotes: 10
Reputation: 1369
Yes. The basic requirement for Kotlin variable is to be marked whether it is Nullable or not to avoid NPE.
Here in your case,
var x: Int? = 123
is assigned as nullable value with ? but when you mapped it to Any object, you have missed to add nullable ? to Any object
so var y: Any? = x
will do as we are marking nullable to y also.
Upvotes: 2
Reputation: 6335
The 1st line of code val x :Int? = 123
is clearly saying that the x is supposed to hold a value of type Int
Kotlin provides the built-in type Int
that is used to for representing numbers.
On the next line, val y :Any = x
, y is supposed to hold a type of Any
, which is the root of the Kotlin class hierarchy. Every Kotlin class has Any
as a superclass.
So there is type mismatch - and hence Kotlin compiler complains that it cannot assign an Int
to an object which you declared to hold type Any
Upvotes: 0
Reputation: 80952
From the docs:
Kotlin's type system is aimed at eliminating the danger of null references from code, also known as the The Billion Dollar Mistake.
In Kotlin, the type system distinguishes between references that can hold null (nullable references) and those that can not (non-null references).
Example:
var a: String = "abc"
a = null // compilation error
var b: String? = "abc" //using `String?` allows you to assign null
b = null // ok
print(b)
Any
is a class same as String
, the only difference is that every class has Any
as it's superclass. But the above that I wrote regarding NPE
is applied to all types in kotlin.
Upvotes: 4