Ж
Size: a a a
Ж
Ж
Ж
M
F
/*00*/ class C<T>(val value : Any) { /*01*/ fun F() : T { /*02*/ try { /*03*/ val v = value as T //Предупреждение компилятора "Unchecked cast: Any to T" /*04*/ return v /*05*/ } catch(ex : RuntimeException) { /*06*/ println("Incompatible") /*07*/ // Хак для иллюстрации того, что эксепшин будет съеден и не пойдет дальше /*08*/ return 0 as T /*09*/ } /*10*/ } /*11*/ } /*12*/ /*13*/ fun fTest() { /*14*/ val a = C<Int>( 12.789 ) /*15*/ println( "rc: ${a.F()}" ) /*16*/ /*17*/ val b = C<Int>( "12.123" ) /*18*/ println( "rc: ${b.F()}" ) /*19*/ }
F
S
/*00*/ class C<T>(val value : Any) { /*01*/ fun F() : T { /*02*/ try { /*03*/ val v = value as T //Предупреждение компилятора "Unchecked cast: Any to T" /*04*/ return v /*05*/ } catch(ex : RuntimeException) { /*06*/ println("Incompatible") /*07*/ // Хак для иллюстрации того, что эксепшин будет съеден и не пойдет дальше /*08*/ return 0 as T /*09*/ } /*10*/ } /*11*/ } /*12*/ /*13*/ fun fTest() { /*14*/ val a = C<Int>( 12.789 ) /*15*/ println( "rc: ${a.F()}" ) /*16*/ /*17*/ val b = C<Int>( "12.123" ) /*18*/ println( "rc: ${b.F()}" ) /*19*/ }
S
class Storage<T>(val value: Any) {И чуть-чуть очищенный декомпилированный код:
@Suppress("UNCHECKED_CAST")
fun get(): T {
return value as T
}
}
fun main() {
println(Storage<Int>(123.456).get())
println(Storage<Int>("123.456").get())
println(123.456 as Int)
}
public static void main() {Котлин понимает, что value является субклассом числа, кастит к нему, а после вызывает метод intValue
System.out.println(((Number)(new Storage(123.456D)).get()).intValue());
System.out.println(((Number)(new Storage("123.456")).get()).intValue());
System.out.println((Integer)123.456D);
}
S
F
S
S
F
S
F
S
S
S
F
S