kotlin中的函数重载问题

kotlin中的函数重载问题,kotlin,kotlin-coroutines,kotlin-android-extensions,Kotlin,Kotlin Coroutines,Kotlin Android Extensions,我试图声明两个suspend方法,其中list of String和PublishRequest对象作为参数。但是IDE在这方面给出了错误。 错误是使函数内部化或删除挂起。但我想在它们内部使用协同程序 override suspend fun publish(publishRequests: List<PublishRequest>) { ///code } suspend fun publish(events: List<Strin

我试图声明两个suspend方法,其中list of String和PublishRequest对象作为参数。但是IDE在这方面给出了错误。 错误是使函数内部化或删除挂起。但我想在它们内部使用协同程序

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

    }


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

    }

覆盖发布(发布请求:列表){
///代码
}
暂停趣味发布(事件:列表){
///代码
}
PublishRequest数据类是内部的。只有当我们添加发布(事件:列表)方法时,问题才会出现。代码在发布(publishRequests:List)


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

你所面临的问题与此有关

类型
列表
列表
将被擦除到
列表
,因此,您将遇到JVM签名冲突

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

  • 更改其名称并避免签名冲突:
  • suspend fun publishRequests(publishRequests:List){}
    挂起事件(事件:列表){}
    
  • 将单个函数与
    具体化的
    类型一起使用,并处理该函数中的不同类型类:
  • suspend-inline-fun发布(对象:列表){
    什么时候{
    PublishRequest::class.java.isAssignableFrom(T::class.java)->//这是PublishRequest的列表
    T::class==String::class->//这是一个字符串列表
    }       
    }
    
    您面临的问题与

    类型
    列表
    列表
    将被擦除到
    列表
    ,因此,您将遇到JVM签名冲突

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

  • 更改其名称并避免签名冲突:
  • suspend fun publishRequests(publishRequests:List){}
    挂起事件(事件:列表){}
    
  • 将单个函数与
    具体化的
    类型一起使用,并处理该函数中的不同类型类:
  • suspend-inline-fun发布(对象:列表){
    什么时候{
    PublishRequest::class.java.isAssignableFrom(T::class.java)->//这是PublishRequest的列表
    T::class==String::class->//这是一个字符串列表
    }       
    }
    
    这可能是因为PublicRequest是内部的,而您的覆盖是公共的。不能在公共函数中公开内部类型。只是猜测而已。无论如何,您发布的代码都不足以回答您的问题。@m0skit0 Yes发布请求是内部的。有没有其他方法可以这样做。将函数设置为内部函数或类型为public(由于封装,首选第一个)。@m0skit0,当我们只有方法覆盖suspend-fun-publish(publishRequests:List){///code}时,函数工作正常。。。只有当我们尝试添加新方法时,问题才会出现,正如我所说的,仅凭代码是无法猜测的。发布。这可能是因为PublicRequest是内部的,而您的覆盖是公共的。不能在公共函数中公开内部类型。只是猜测而已。无论如何,您发布的代码都不足以回答您的问题。@m0skit0 Yes发布请求是内部的。有没有其他方法可以这样做。将函数设置为内部函数或类型为public(由于封装,首选第一个)。@m0skit0,当我们只有方法覆盖suspend-fun-publish(publishRequests:List){///code}时,函数工作正常。。。只有当我们尝试添加新方法时,问题才会出现,正如我所说的,仅凭代码是无法猜测的。在发布一个.Hi@giorgio antonioli之后,我们使用JvmName注释来缓解这个问题,但这不适用于在接口中定义方法。你能告诉我怎么用这个吗interfaces@Naman_Jain不能在接口中使用
    @JvmName
    更改函数名。您仍然可以在接口中使用
    publish(object:List,klass:Class)
    来检查类型。您好@giorgio antonioli,我们使用JvmName注释来缓解这个问题,但这不适用于在接口中定义方法。你能告诉我怎么用这个吗interfaces@Naman_Jain不能在接口中使用
    @JvmName
    更改函数名。您仍然可以在界面中使用
    publish(object:List,klass:Class)
    来检查类型。