How to implement mutable optional in Kotlin?
The compiler wants you to write code that will be type-safe for all possible T
, both nullable and not-null (unless you specify a not-null upper bound for the type parameter, such as T : Any
, but this is not what you need here).
If you store T?
in a property, it is a different type from T
in case of not-null type arguments, so you are not allowed to use T
and T?
interchangeably.
However, making an unchecked cast allows you to bypass the restriction and return the T?
value as T
. Unlike the not-null assertion (!!
), the cast is not checked at runtime, and it won't fail when it encounters a null
.
Change the get()
function as follows:
fun get(): T {
if (!isSet) {
throw Error("Value not set")
}
@Suppress("unchecked_cast")
return value as T
}