考虑重载的函数foo
:
fun foo(i: Int) { /* */ }
fun foo(i_s: Collection<Int>) { /* */ }
我收到以下代码的重载分辨率歧义错误:
val bar = foo(Stream.empty<Int>().collect(Collectors.toList()))
超载分辨率的不确定性:
public fun foo(i:Int):...
中定义的单位 public fun foo(i_s:Collection):在...中定义的单位
据我所知,解决方案应该很明确:我正在将流收集到列表中,因此应该使用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>)
,则错误更改为
类型推断失败。预期类型不匹配:推断的类型为(Mutable)List!但应该是Int
这为我提出了更多问题:
答案 0 :(得分:2)
这看起来像是旧推理算法中的错误,因为它可以与新推理正确配合。我在Kotlin错误跟踪程序中提交了issue,至少是为了添加回归测试。您可以关注它进行更新。
有关新推论的更多信息:
https://youtrack.jetbrains.com/issue/KT-31507
https://blog.jetbrains.com/kotlin/2019/06/kotlin-1-3-40-released/