- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
考虑重载函数 foo
:
fun foo(i: Int) { /* */ }
fun foo(i_s: Collection<Int>) { /* */ }
我收到以下代码的重载解析歧义错误:
val bar = foo(Stream.empty<Int>().collect(Collectors.toList()))
Overload resolution ambiguity:
public fun foo(i: Int): Unit defined in ...
public fun foo(i_s: Collection): Unit defined in ...
据我所知,分辨率应该很清楚:我正在将流收集到一个列表中,所以 foo(Collection<Int>)
应采取。更多实验表明无法正确解析泛型,因此:
我测试了一些其他的东西:foo(listOf())
没有错误,也没有
val bar = Stream.empty<Int>().collect(Collectors.toList())
val baz = foo(bar)
替换 toList()
与 toSet()
不会改变行为,但 toCollection { ArrayList<Int>() }
在所有情况下都可以编译。
如果我更改 foo
至fun <T> foo(i_s: Collection<T>)
, 错误变为
Type inference failed. Expected type mismatch: inferred type is (Mutable)List! but Int was expected
这为我打开了更多问题:
最佳答案
看起来这是旧推理算法中的一个错误,因为它可以与新推理一起正常工作。我提交了 issue在 Kotlin 错误跟踪器中,至少用于添加回归测试。您可以关注它以获取更新。
有关新推理的更多信息:
https://youtrack.jetbrains.com/issue/KT-31507
https://blog.jetbrains.com/kotlin/2019/06/kotlin-1-3-40-released/
关于Kotlin 错误类型推断导致重载解决方案含糊不清,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56913003/
我是一名优秀的程序员,十分优秀!