Kotlin错误类型推断提供了重载解析度的歧义

时间:2019-07-06 09:56:01

标签: kotlin type-inference overload-resolution

考虑重载的函数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>)。更多的实验表明无法正确解析泛型,因此:

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

我测试了其他一些内容: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

这为我提出了更多问题:

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

1 个答案:

答案 0 :(得分:2)

这看起来像是旧推理算法中的错误,因为它可以与新推理正确配合。我在Kotlin错误跟踪程序中提交了issue,至少是为了添加回归测试。您可以关注它进行更新。

有关新推论的更多信息:

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

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