gpt4 book ai didi

generics - 如何使用泛型处理函数的重载解析歧义?

转载 作者:IT老高 更新时间:2023-10-28 13:38:30 24 4
gpt4 key购买 nike

考虑这个类有两个函数,一个是 Int参数,另一个是通用的:

class C<K, V> {
// ...

operator fun f(index: Int): Pair<K, V> = ...
operator fun f(key: K): V = ...
}

当参数化为C<Int, SomeType>时, KInt ,并且两个函数都匹配调用,导致错误:

val m = C<Int, SomeType>()
m.f(1)

Overload resolution ambiguity. All these functions match:

  • public final fun f(index: Int): SomeType defined in C
  • public final fun f(key: Int): Pair<Int, SomeType>? defined in C

如何调用f我想要这种情况?

最佳答案

如果你有幸拥有不同的函数参数名称,使用 named arguments 就可以了:

m.f(index = 1) // calls f(index: Int)
m.f(key = 1) // calls f(key: K)

否则,如果参数名称相同(或在 Java 中定义),一种可能的解决方法是执行 unchecked casts 以使编译器选择所需的选项:

  • 调用 f(index: Int) 可以使用

    @Suppress("UNCHECKED_CAST")
    val s = (m as C<*, SomeType>).f(1) as Pair<Int, SomeType>

    强制转换为 C<*, SomeType> makes K equivalent to in Nothing, out Any ,这意味着 f(key: K) 没有有效参数,因此调用自然会解析为 f(index: Int) ,但您需要将结果强制转换回来,否则为 Pair<Any, SomeType>

  • 要调用 f(key: K),请使用:

    @Suppress("UNCHECKED_CAST")
    val s = (m as C<Any, SomeType>).f(1 as Any)

    同样,转换为 C<Any, SomeType> 会将所需函数的签名更改为 f(key: Any) ,并且要调用它,只需将 1 向上转换为 Any

在多个类型参数冲突的情况下都是一样的(例如,当 f(key: K)f(value: V) 都是 K 时,VSomeType ),只需使用命名参数或将对象强制转换为 ban 函数之一( in Nothing ) 或使其接受 Any

关于generics - 如何使用泛型处理函数的重载解析歧义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40722976/

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