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