hot*_*key 9 generics ambiguous overload-resolution kotlin
考虑这个有两个函数的类,一个带有Int参数,另一个带有泛型函数:
class C<K, V> {
// ...
operator fun f(index: Int): Pair<K, V> = ...
operator fun f(key: K): V = ...
}
Run Code Online (Sandbox Code Playgroud)
当它被参数化为C<Int, SomeType>,K是Int,并且两个函数都匹配调用时,导致错误:
val m = C<Int, SomeType>()
m.f(1)
Run Code Online (Sandbox Code Playgroud)
过载分辨率模糊.所有这些功能都匹配:
public final fun f(index: Int): SomeType定义于Cpublic final fun f(key: Int): Pair<Int, SomeType>?定义于C
f在这种情况下,如何拨打我想要的电话?
如果你有幸拥有函数的不同参数名,那么使用命名参数就可以了:
m.f(index = 1) // calls f(index: Int)
m.f(key = 1) // calls f(key: K)
Run Code Online (Sandbox Code Playgroud)
否则,如果参数名称相同(或在Java中定义),一种可能的解决方法是执行未经检查的强制转换以使编译器选择所需的选项:
要打电话f(index: Int),你可以使用
@Suppress("UNCHECKED_CAST")
val s = (m as C<*, SomeType>).f(1) as Pair<Int, SomeType>
Run Code Online (Sandbox Code Playgroud)
演员以C<*, SomeType> 使K等同于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)
Run Code Online (Sandbox Code Playgroud)
类似地,强制C<Any, SomeType>转换将所需函数的签名更改为f(key: Any),并将其调用,只是向上转换1为Any.
在几个类型参数发生冲突的情况下(例如f(key: K),f(value: V)何时K和V都是SomeType),它们都是相同的,只需使用命名参数或强制转换对象以禁止其中一个函数(in Nothing)或使其接受Any.
| 归档时间: |
|
| 查看次数: |
3085 次 |
| 最近记录: |