【问题标题】:Issue with function Overloading in kotlinkotlin 中函数重载的问题
【发布时间】:2020-07-12 12:04:06
【问题描述】:

我正在尝试使用 String 列表和 PublishRequest 对象作为参数声明两个挂起方法。但是 IDE 对此给出了错误。 错误是使函数之一成为内部函数或删除挂起。但我想在它们里面都使用协程。

    override suspend fun publish(publishRequests: List<PublishRequest>) {
       ///code

    }


    suspend fun publish(events: List<String>) {
     ///code

    }

PublishRequest Data 类是内部的。只有当我们添加 publish(events: List) 方法时,问题才会出现。 publish(publishRequests: List)

的代码运行良好

你能解释一下为什么会这样吗?

【问题讨论】:

  • 这可能是因为 PublicRequest 是内部的并且您的覆盖是公开的。您不能在公共函数中公开内部类型。只是一个猜测。无论如何,您发布的代码不足以回答您的问题。
  • @m0skit0 是的发布请求是内部的。有没有其他方法可以做到这一点? .
  • 将函数设为 internal 或将类型设为 public(第一个首选是因为封装)。
  • @m0skit0 ,当我们只有方法覆盖挂起 fun publish(publishRequests: List) { ///code }... 这个问题只有当我们尝试时才会出现添加新方法
  • 就像我说的那样,仅凭该代码无法猜测。发布SSCCE

标签: kotlin kotlin-coroutines kotlin-android-extensions


【解决方案1】:

您遇到的问题与type erasure有关。

List&lt;PublishRequest&gt;List&lt;String&gt; 类型被擦除为 List&lt;*&gt;,因此,您将遇到 JVM 签名冲突。

要解决您的问题,您有两种不同的解决方案。

  1. 更改他们的名字并避免签名冲突:
    suspend fun publishRequests(publishRequests: List<PublishRequest>) {}
    suspend fun publishEvents(events: List<String>) {}
  1. 使用具有reified 类型的单个函数并处理该函数内的不同类型类:
suspend inline fun <reified T> publish(objects: List<T>) {
    when {
        PublishRequest::class.java.isAssignableFrom(T::class.java) -> // it's a list of PublishRequest
        T::class == String::class -> // it's a list of String
    }       
}

【讨论】:

  • 嗨@giorgio-antonioli,我们使用JvmName 注释来缓解这种担忧,但这不适用于在接口中定义方法。你能告诉我如何在接口中使用它
  • @Naman_Jain 你不能在接口中使用@JvmName 来更改函数的名称。您仍然可以在接口中使用publish(object: List&lt;T&gt;, klass: Class&lt;T&gt;) 来检查类型。
猜你喜欢
  • 2019-04-25
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
相关资源
最近更新 更多