- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
考虑这个类有两个函数,一个是 Int
参数,另一个是通用的:
class C<K, V> {
// ...
operator fun f(index: Int): Pair<K, V> = ...
operator fun f(key: K): V = ...
}
当参数化为C<Int, SomeType>
时, K
是 Int
,并且两个函数都匹配调用,导致错误:
val m = C<Int, SomeType>()
m.f(1)
Overload resolution ambiguity. All these functions match:
public final fun f(index: Int): SomeType
defined inC
public final fun f(key: Int): Pair<Int, SomeType>?
defined inC
如何调用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
时,V
和 SomeType
),只需使用命名参数或将对象强制转换为 ban 函数之一( in Nothing
) 或使其接受 Any
。
关于generics - 如何使用泛型处理函数的重载解析歧义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40722976/
我是一名优秀的程序员,十分优秀!