【问题标题】:Overriding function with generics in kotlin在 kotlin 中使用泛型覆盖函数
【发布时间】:2015-03-06 14:33:32
【问题描述】:

例如我有以下示例代码

fun f<T>( cb: (T, Int) -> Unit ): Unit {
  println("f called with cb which accepts 2 arguments"); 
}

fun f<T>( cb: (T) -> Unit ): Unit {
  println("f called with cb which accepts 1 argument"); 
  f<T> {item, position -> cb(item) }
}

fun main(args : Array<String>) {
  f { item -> }
  f { item, position -> }
}

不知不觉我希望 f 函数选择正确的实现取决于我要传递给闭包的参数数量

目前 kompiller 给我错误:

(8, 7) : Overload resolution ambiguity: 
internal fun <T> f(cb: (T, kotlin.Int) -> kotlin.Unit): kotlin.Unit defined in root package
internal fun <T> f(cb: (T) -> kotlin.Unit): kotlin.Unit defined in root package

在线沙盒代码:http://kotlin-demo.jetbrains.com/?publicLink=100745728838428857114-628607155

编译器版本:org.jetbrains.kotlin:kotlin-gradle-plugin:0.10.770


UPD:youtrack 上的相关问题:https://youtrack.jetbrains.com/issue/KT-6939

【问题讨论】:

  • 看起来像一个错误。请向追踪者报告:youtrack.jetbrains.com/issues/KT#newissue
  • 错误信息现在不同了(编译器版本 0.11.693):“类型推断失败:没有足够的信息来推断 fun f(cb: (T) -> kotlin.单位):kotlin.Unit 请明确指定。”这对我来说很有意义:)
  • @miensol 但它仍然无法按预期工作:/
  • @ruX 好吧,我是 Kotlin 的新手,所以这可能是一个愚蠢的问题,但是您希望 item 的类型在 main 的第一行中的 f { item -&gt; /* here */ } 内,当它执行时(假设它已编译)?
  • @miensol 你是对的,谢谢你的正确问题!

标签: function generics overriding kotlin


【解决方案1】:

感谢@miensol,我意识到这是我的错误。我在调用f() 时忘记为 T 指定类型。

固定代码:

fun f<T>( cb: (T, Int) -> Unit ): Unit {
  println("f called with cb which accepts 2 arguments"); 
}

fun f<T>( cb: (T) -> Unit ): Unit {
  println("f called with cb which accepts 1 argument"); 
  f<T> {item, position -> cb(item) }
}

fun main(args : Array<String>) {
  f<String> { item -> }
  f<Boolean> { item, position -> }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多