Кто-нибудь может объяснить, почему универсальный параметр теряется в Supplier
лямбда, а не в Callable
?
Я создал интерфейс, который захватывает универсальный тип и вспомогательную функцию, которая его создает
abstract class TypeRef<T> protected constructor() {
val type: Type = (javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0]
override fun toString(): String {
return type.toString()
}
}
inline fun <reified T> getTypeRef(): TypeRef<T> {
return object: TypeRef<T>() {};
}
Но тестирование приводит к разным результатам в зависимости от того, где он называется
inline fun <reified T> testTypeRef(): TypeRef<T> {
val ref0 = getTypeRef<T>()
println("In root $ref0")
Callable {
val ref1 = getTypeRef<T>()
println("In callable $ref1")
}.call()
Supplier {
val ref2 = getTypeRef<T>()
println("In supplier $ref2")
""
}.get()
return ref0
}
производит
In root java.util.List<? extends java.util.concurrent.atomic.AtomicReference<java.lang.String>>
In callable java.util.List<? extends java.util.concurrent.atomic.AtomicReference<java.lang.String>>
In supplier T
Чего мне не хватает?