kotlin 中函数重载的问题

Nam*_*ain 3 kotlin kotlin-android-extensions kotlin-coroutines

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

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

    }


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

    }

Run Code Online (Sandbox Code Playgroud)

PublishRequest 数据类是内部的。仅当我们添加publish(events: List)方法时,问题才会出现。代码运行良好,发布(publishRequests:List)

你能解释一下为什么会发生这种情况吗?

Gio*_*oli 5

您面临的问题与类型擦除有关。

类型List<PublishRequest>List<String>被删除为List<*>,因此,您将遇到 JVM 签名冲突。

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

  1. 更改他们的名字并避免签名冲突:
    suspend fun publishRequests(publishRequests: List<PublishRequest>) {}
    suspend fun publishEvents(events: List<String>) {}
Run Code Online (Sandbox Code Playgroud)
  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
    }       
}
Run Code Online (Sandbox Code Playgroud)