Kotlin 为什么一个人会得到;平台声明冲突“;但是另一个还好吗?

Kotlin 为什么一个人会得到;平台声明冲突“;但是另一个还好吗?,kotlin,Kotlin,具有定义的接口: interface IData { fun getHash() : Int fun getUUID(): UUID ...... } 正在尝试为接口创建对象。fun getUUID():UUID很好,但是fun getHash():Int得到如下错误 可能有什么问题?为什么它们不同 fun buidlDataList () : ArrayList<IData> { val dataList = ArrayList<IDa

具有定义的接口:

interface IData {

    fun getHash() : Int
    fun getUUID(): UUID

    ......
}
正在尝试为接口创建对象。
fun getUUID():UUID
很好,但是
fun getHash():Int
得到如下错误

可能有什么问题?为什么它们不同

fun buidlDataList () : ArrayList<IData> {

    val dataList = ArrayList<IData>(0)

    dataList.add(object : IData {

        val hash: Int by lazy { dataFetchers.size+System.currentTimeMillis().toInt() } //<=== get error
        override fun getHash(): Int {                                                  //<=== get the same error
            return hash
        }

        val uuid: UUID by lazy { UUID.randomUUID() }
        override fun getUUID(): UUID {
            return uuid
        }
        ......
    }
}


Platform declaration clash:  The following declarations have the same JVM signature(getHash() I):
    * public final fun <get-hash>(): int  defined in com.data. buidlDataList <no name provided>
    * public open fun getHash(): int defined in defined in com.data. buidlDataList <no name provided>
有趣的BuildDataList():ArrayList{ val dataList=ArrayList(0) 添加(对象:IData){
val hash:Int by lazy{dataFetchers.size+System.currentTimeMillis().toInt()}/变量创建它们自己的getter,但您也显式定义它们。当您声明var或val时,它们通常会自动生成自己的getter 1。如果您不创建自定义getter,则私有val或vars不会

但在所有其他情况下,这:

val x: Int = TODO()
生成一个getter1

在你的例子中,我建议直接在接口中使用val。你看,生成的getter与显式声明的getHash方法具有相同的名称。getter也不会重写方法(除非你用@Jvm注释之一对其进行注释,我不记得是哪个,但你实际上并不需要这些注释)

因此,您将界面更改为:

interface IData {
    val hash: Int
    val uuid: UUID
}
并移除覆盖对象中的getter,并将
override
添加到VAL:

dataList.add(object : IData {
    override val hash: Int by lazy { dataFetchers.size+System.currentTimeMillis().toInt() }
    override val uuid: UUID by lazy { UUID.randomUUID() }
}
第一个接口实际上相当于使用get和set方法声明一个接口。如果您从Java重写它,它将要求您重写
getHash()
getUid()
,并且您需要在本地声明该字段。Kotlin的工作方式不同,因为它会自动生成setter

由于您可以在接口中声明变量,而不会弄乱Java互操作,因此我强烈建议您在@Jvm*注释上使用它(主要是因为它使代码更容易理解,尽管这是个人偏好)


此外,如果您反编译Kotlin字节码,您将看到带有变量的接口编译成什么:

public interface IData {
   int getHash();

   @NotNull
   UUID getUuid();
}
因此,它与您最初使用的完全相同,只是由于变量名冲突,子类中没有冲突


只有一个存在冲突的原因是,正如您在接口中看到的,
val uuid
创建了一个名为
getUuid
的getter,而您的接口声明了
getUuid
。Java和Kotlin中的方法区分大小写,这就是为什么它们不冲突的原因。如果您将变量命名为大写的
uuid
,您将在那件事上也有冲突


1:假设变量/常量不在方法中。顶级变量、接口中的变量、枚举、类、对象和伴生对象都会生成getter/setter,但如果在方法中声明变量,则在适用的地方自然不会有getter和setter。

变量创建自己的getter,但您也可以明确定义它们。当您声明var或val时,它们通常会自动生成自己的getter 1。如果您不创建自定义getter,则私有val或var不会自动生成

但在所有其他情况下,这:

val x: Int = TODO()
生成一个getter1

在你的例子中,我建议直接在接口中使用val。你看,生成的getter与显式声明的getHash方法具有相同的名称。getter也不会重写方法(除非你用@Jvm注释之一对其进行注释,我不记得是哪个,但你实际上并不需要这些注释)

因此,您将界面更改为:

interface IData {
    val hash: Int
    val uuid: UUID
}
并移除覆盖对象中的getter,并将
override
添加到VAL:

dataList.add(object : IData {
    override val hash: Int by lazy { dataFetchers.size+System.currentTimeMillis().toInt() }
    override val uuid: UUID by lazy { UUID.randomUUID() }
}
第一个接口实际上相当于使用get和set方法声明一个接口。如果您从Java重写它,它将要求您重写
getHash()
getUid()
,并且您需要在本地声明该字段。Kotlin的工作方式不同,因为它会自动生成setter

由于您可以在接口中声明变量,而不会弄乱Java互操作,因此我强烈建议您在@Jvm*注释上使用它(主要是因为它使代码更容易理解,尽管这是个人偏好)


此外,如果您反编译Kotlin字节码,您将看到带有变量的接口编译成什么:

public interface IData {
   int getHash();

   @NotNull
   UUID getUuid();
}
因此,它与您最初使用的完全相同,只是由于变量名冲突,子类中没有冲突


只有一个存在冲突的原因是,正如您在接口中看到的,
val uuid
创建了一个名为
getUuid
的getter,而您的接口声明了
getUuid
。Java和Kotlin中的方法区分大小写,这就是为什么它们不冲突的原因。如果您将变量命名为大写的
uuid
,您将在那件事上也有冲突

1:假设变量/常量不在方法中。顶级变量、接口中的变量、枚举、类、对象和伴随对象都会生成getter/setter,但如果在方法中声明变量,则在适用的地方自然不会有getter和setter