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 签名冲突。
要解决您的问题,您有两种不同的解决方案。
- 更改他们的名字并避免签名冲突:
suspend fun publishRequests(publishRequests: List<PublishRequest>) {}
suspend fun publishEvents(events: List<String>) {}
- 使用具有
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
}
}
我正在尝试声明两个以字符串列表和 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 签名冲突。
要解决您的问题,您有两种不同的解决方案。
- 更改他们的名字并避免签名冲突:
suspend fun publishRequests(publishRequests: List<PublishRequest>) {}
suspend fun publishEvents(events: List<String>) {}
- 使用具有
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
}
}