Kotlin错误类型推断给重载解决方案带来歧义

Qw3*_*3ry 7 type-inference overload-resolution kotlin

考虑重载函数foo

fun foo(i: Int) { /* */ }
fun foo(i_s: Collection<Int>) { /* */ }
Run Code Online (Sandbox Code Playgroud)

我收到以下代码的重载解决方案歧义错误:

val bar = foo(Stream.empty<Int>().collect(Collectors.toList()))
Run Code Online (Sandbox Code Playgroud)

过载分辨率的歧义:
public fun foo(i:Int):在...中定义的单位
public fun foo(i_s:Collection):在...中定义的单位

据我所知,解决方案应该很明确:我正在将流收集到一个列表中,因此foo(Collection<Int>)应该采取。更多的实验表明无法正确解析泛型,因此:

  1. 为什么在这种情况下泛型解析失败?
  2. 该“缺陷”是否记录在某处?这是我应该报告的错误吗?

我测试了其他几件事:foo(listOf())不会出错,也不会

val bar = Stream.empty<Int>().collect(Collectors.toList())
val baz = foo(bar)
Run Code Online (Sandbox Code Playgroud)

替换toList()toSet()不会改变行为,但是toCollection { ArrayList<Int>() }在所有情况下都可以编译。

如果更改foofun <T> foo(i_s: Collection<T>),则错误更改为

类型推断失败。预期类型不匹配:推断的类型为(Mutable)List!但是Int被期望

这为我带来了更多问题:

  1. 如果将中间结果存储在变量中,为什么解析有效?毕竟,它的类型也是自动解析的吗?
  2. 类型推断错误是什么意思?为什么会发生?

Ale*_*kov 3

看起来这是旧推理算法中的一个错误,因为它可以在新推理中正常工作。我在 Kotlin bug 跟踪器中提交了一个问题,至少是添加了回归测试。您可以关注它以获取更新。

有关新推论的更多信息:

https://youtrack.jetbrains.com/issue/KT-31507

https://blog.jetbrains.com/kotlin/2019/06/kotlin-1-3-40-released/