kotlin 中的函数重载问题

Issue with function Overloading in kotlin

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

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

    }


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

    }

PublishRequest 数据 class 是内部的。只有当我们添加 publish(events: List) 方法时,问题才会出现。代码工作正常 publish(publishRequests: List)

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

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

类型 List<PublishRequest>List<String> 被擦除为 List<*>,因此,您将遇到 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
    }       
}