首页 > 解决方案 > Kotlin 泛型类型不匹配

问题描述

    fun <R, F : Function<R>?, K : KFunction<R>?> Array<F>.reflect(): Array<K> = this.map<F, K> { it?.reflect<R>() }.toTypedArray()

map的 lambda中的编译时错误

类型不匹配:推断的类型是KFunction<R>?K预期的

标签: kotlingenericstype-inference

解决方案


我感到困惑的原因是,为什么KFunction<R>?不将KifK定义为 的任何子类型KFunction<R>

正如您所说K的是 的子类型KFunction<R>,但Function<R>.reflect()不返回K,它返回预期KFunction<R>类型值的位置。K考虑这个例子:

class A : KFunction<String> {
    // ...implements all methods of KFunction<String>
}

arrayOf({ "foo" }).reflect<String, () -> String, A>()
  • RString
  • FFunction<String>
  • KA,一个扩展的类KFunction<String>

现在为了满足函数,该it?.reflect<R>()部分应该返回一个 type 的值A,但它会返回KFunction<String>

也许您为想要实现的目标声明了太多类型参数?这个功能怎么样:

fun <R> Array<out Function<R>?>.reflect(): Array<KFunction<R>?> =
        this.map { it?.reflect<R>() }.toTypedArray()

如果您有任何问题,请发表评论。


推荐阅读