kotlin - 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
预期的
解决方案
我感到困惑的原因是,为什么
KFunction<R>?
不将K
ifK
定义为 的任何子类型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>()
R
是String
F
是Function<String>
K
是A
,一个扩展的类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()
如果您有任何问题,请发表评论。
推荐阅读
- amazon-redshift - 复制命令中的 Redshift 相关子查询
- go - 使用 defer 函数检查命名返回错误
- swiftui - 如何更改此 UIViewRepresentable 的高度?
- swift - swift中有什么包罗万象的吗?
- c# - 一次只执行几个线程
- java - 在 XML 中使用自定义视图而不使用完全限定名称
- mysql - 我想将具有多列的表中的数据传递到单列中的另一个表
- rest - 用于 C# 开发/Windows 的新 REST API;用什么?
- javascript - 是否可以使用 react-beautiful-dnd 将项目溢出到另一列
- php - Doctrine\DBAL\Driver\PDOException:找不到驱动程序 laravel postgresql