Общий параметр теряется в лямбде поставщика, но не в вызываемом. - PullRequest
1 голос
/ 10 ноября 2019

Кто-нибудь может объяснить, почему универсальный параметр теряется в 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

Чего мне не хватает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...