Let's look at the generated bytecode:
fun <T> getValue(): T {
return 1000 as T
}
// becomes
public final getValue()Ljava/lang/Object;
L0
LINENUMBER 17 L0
SIPUSH 1000
INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
CHECKCAST java/lang/Object
ARETURN
L1
LOCALVARIABLE this LSimpleClass; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
, 1000 Long, , java/lang/Object (, ) 1000 Integer.
( : ) , . , ClassCastException
fun f3() {
val simpleObject = SimpleClass()
simpleObject.getValue<SimpleClass>()
val number = simpleObject.getValue<SimpleClass>()
}
Long? ? , -:
var number: Long? = null | var number: Long = 0
|
ACONST_NULL | LCONST_0
CHECKCAST java/lang/Long | LSTORE 0
ASTORE 0 |
number = simpleObject.getValue<Long>() [both]
ALOAD 1 |
INVOKEVIRTUAL SimpleClass.getValue ()Ljava/lang/Object; [both]
CHECKCAST java/lang/Long | CHECKCAST java/lang/Number
ASTORE 0 | INVOKEVIRTUAL java/lang/Number.longValue ()J
| LSTORE 0
, - number: Long Number, Number.longValue, Long (Long Java)
- number: Long? Long? (Long Java), ClassCastException.
, - . , as , :
Warning:(21, 16) Kotlin: Unchecked cast: kotlin.Int to T