35 lines
921 B
Kotlin
Vendored
35 lines
921 B
Kotlin
Vendored
// WITH_REFLECT
|
|
// FULL_JDK
|
|
// TARGET_BACKEND: JVM
|
|
// FILE: 1.kt
|
|
|
|
package test
|
|
|
|
import java.lang.reflect.ParameterizedType
|
|
import java.lang.reflect.Type
|
|
|
|
open class TypeLiteral<T> {
|
|
val type: Type
|
|
get() = (javaClass.genericSuperclass as ParameterizedType).getActualTypeArguments()[0]
|
|
}
|
|
|
|
// normal inline function works fine
|
|
inline fun <reified T> typeLiteral(): TypeLiteral<T> = object : TypeLiteral<T>() {}
|
|
|
|
// nested lambda loses reification of T
|
|
inline fun <reified T> brokenTypeLiteral(): TypeLiteral<T> = "".run { typeLiteral<T>() }
|
|
|
|
// FILE: 2.kt
|
|
|
|
import test.*
|
|
|
|
fun box(): String {
|
|
val type1 = typeLiteral<List<String>>().type.toString()
|
|
if (type1 != "java.util.List<? extends java.lang.String>") return "fail 1: $type1"
|
|
|
|
val type2 = brokenTypeLiteral<List<String>>().type.toString()
|
|
if (type2 != "java.util.List<? extends java.lang.String>") return "fail 2: $type2"
|
|
|
|
return "OK"
|
|
}
|