gpt4 book ai didi

Kotlin 错误类型推断导致重载解决方案含糊不清

转载 作者:IT老高 更新时间:2023-10-28 13:42:41 26 4
gpt4 key购买 nike

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

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

我测试了一些其他的东西:foo(listOf())没有错误,也没有

val bar = Stream.empty<Int>().collect(Collectors.toList())
val baz = foo(bar)

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

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

Type inference failed. Expected type mismatch: inferred type is (Mutable)List! but Int was expected

这为我打开了更多问题:

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

最佳答案

看起来这是旧推理算法中的一个错误,因为它可以与新推理一起正常工作。我提交了 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com