mirror of
https://github.com/jlengrand/kotlin.git
synced 2026-05-10 00:21:35 +00:00
38 lines
805 B
Kotlin
Vendored
38 lines
805 B
Kotlin
Vendored
// !LANGUAGE: +PolymorphicSignature
|
|
// IGNORE_BACKEND_FIR: JVM_IR
|
|
// TARGET_BACKEND: JVM
|
|
// FULL_JDK
|
|
// SKIP_JDK6
|
|
// WITH_RUNTIME
|
|
|
|
import java.lang.invoke.MethodHandles
|
|
import java.lang.invoke.MethodType
|
|
import java.lang.invoke.WrongMethodTypeException
|
|
|
|
interface I {
|
|
fun get(): String
|
|
}
|
|
|
|
class C {
|
|
fun run(i: I): String = i.get()
|
|
}
|
|
|
|
fun box(): String {
|
|
val mh = MethodHandles.lookup().findVirtual(
|
|
C::class.java, "run",
|
|
MethodType.methodType(String::class.java, I::class.java)
|
|
)
|
|
|
|
try {
|
|
return mh.invokeExact(C(), object : I {
|
|
override fun get(): String = "Fail"
|
|
}) as String
|
|
} catch (e: WrongMethodTypeException) {
|
|
// OK
|
|
}
|
|
|
|
return mh.invoke(C(), object : I {
|
|
override fun get(): String = "OK"
|
|
}) as String
|
|
}
|