1

任何人都可以解释为什么通用参数在Supplierlambda 而不是在 lambda中丢失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

我错过了什么?

4

0 回答 0