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>)应该采取。更多的实验表明无法正确解析泛型,因此:
我测试了其他几件事: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>() }在所有情况下都可以编译。
如果更改foo为fun <T> foo(i_s: Collection<T>),则错误更改为
类型推断失败。预期类型不匹配:推断的类型为(Mutable)List!但是Int被期望
这为我带来了更多问题:
看起来这是旧推理算法中的一个错误,因为它可以在新推理中正常工作。我在 Kotlin bug 跟踪器中提交了一个问题,至少是添加了回归测试。您可以关注它以获取更新。
有关新推论的更多信息:
https://youtrack.jetbrains.com/issue/KT-31507
https://blog.jetbrains.com/kotlin/2019/06/kotlin-1-3-40-released/
| 归档时间: |
|
| 查看次数: |
97 次 |
| 最近记录: |