java - 返回扩展类的类型给平台声明冲突

标签 java kotlin

我有以下声明:

val selectedPhotos: MutableLiveData<List<Photo>> = MutableLiveData()

我有以下方法应该返回 selectedPhotos,它是 MutableLiveData 类型。

fun getSelectedPhotos(): MutableLiveData<List<Photo>> {
    return selectedPhotos
}

但是,以下给我一个错误:

Platform declaration clash: The following declarations have the same JVM signature (getSelectedPhotos()Landroidx/lifecycle/MutableLiveData;):
    fun <get-selectedPhotos>(): MutableLiveData<List<Photo>> defined in com.raywenderlich.android.combinestagram.SharedViewModel
    fun getSelectedPhotos(): MutableLiveData<List<Photo>> defined in com.raywenderlich.android.combinestagram.SharedViewModel

但是,如果我更改乐趣以返回以下内容,一切正常:

fun getSelectedPhotos(): LiveData<List<Photo>> {
    return selectedPhotos
}

但是,看看下面的 MutableLiveData 扩展了 LiveData

public class MutableLiveData<T> extends LiveData<T> {
...
}

只是困惑为什么我不能使用 MutableLiveData 作为返回类型,这是我声明的正确类型。

提前非常感谢,

最佳答案

当您在 kotlin 中声明某些内容时,kotlin 会为您创建它的 setter 和 getter。因此,考虑到您声明 var abc,kotlin 将声明 setAbcgetAbc,这对于数据类来说非常少。

在您的例子中,由于您的属性名称是 selectedPhotos,kotlin 已经创建了一个名为 getSelectedPhotos 且返回类型为 MutableLiveData> 的 getter。因此,您会遇到冲突,因为两个方法具有相同的名称和返回类型。

就您而言,您不需要显式声明此 getSelectedPhotos ,因为 kotlin 已经为您声明了这一点。您可以在 kotlin 和 JAVA 类中访问 kotlin 声明的 getter 和 setter。

编辑: 如果您想查看 kotlin 文件生成的 JAVA 类,请打开 kotlin 文件,然后转到 工具 -> Kotlin -> 显示 Kotlin字节码,然后单击打开屏幕上的反编译按钮。

关于java - 返回扩展类的类型给平台声明冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60354449/

相关文章:

android - 为什么最大长度过滤器不起作用?安卓

java - 如何检查方法的哪一部分使用时间最多?

android - 为什么firebase authUI现在不能使用google账号登录,但之前可以登录

android - 以编程方式将 MaterialButton 样式设置为 TextButton

java - 安卓注册登录app报错

android - 无尽的 RecyclerView 数据加载逻辑在所有设备上并不一致

kotlin - 将音频频谱作为 libGDX 中的纹理传递给着色器

java - Hadoop解析文件名java

java程序将EBCDIC转换为ASCII

javascript - 在 Java 和 Python 中实现相同的 XorShift