Kotlin平台声明冲突报错:JVM签名重复问题排查
平台声明冲突问题原因及解决办法
问题原因
Kotlin中类的属性会自动在JVM层面生成对应的getter方法。你定义的private val hosts属性,JVM会自动生成一个名为getHosts()的私有getter方法,而你手动编写的public fun getHosts()方法和这个自动生成的getter拥有完全相同的JVM签名,导致JVM无法区分两者,从而抛出平台声明冲突错误。
解决方案
有两种常见的解决方式:
方式一:直接公开属性,移除手动getter
Kotlin支持直接访问类的属性,无需手动编写getter方法。将hosts的可见性从private改为public,删除手动定义的getHosts()方法即可:
class HostsViewModel : ViewModel() { private val hostsService = HostsService() val hosts: MutableLiveData<List<Host>> by lazy { MutableLiveData<List<Host>>().also { loadHosts() } } private fun loadHosts(){ hosts.value = hostsService.getHosts().body() } }
外部代码可以直接通过viewModel.hosts访问该LiveData。
方式二:修改手动getter的方法名
如果需要保持hosts属性的私有性,只需修改手动编写的getter方法名称,避免和自动生成的getter重名,比如改为getHostsLiveData():
class HostsViewModel : ViewModel() { private val hostsService = HostsService() private val hosts: MutableLiveData<List<Host>> by lazy { MutableLiveData<List<Host>>().also { loadHosts() } } fun getHostsLiveData(): MutableLiveData<List<Host>> { return hosts } private fun loadHosts(){ hosts.value = hostsService.getHosts().body() } }
内容的提问来源于stack exchange,提问作者124697
相关产品推荐
相关产品推荐

