我收到一个错误。如下所示:
Error 1:平台声明冲突:以下声明具有相同的JVM签名(getData()Ljava/lang/Object;):fun ():I defined in typeErasure2 fun getData():I defined in typeErasure2
Error 2:平台声明冲突:以下声明具有相同的JVM签名(getData()Ljava/lang/Object;):fun ():I defined in typeErasure2 fun getData():I defined in typeErasure2
fun main(args : Array<String>){
var te = typeErasure("Jennie")
println(te.getData())
var te2 = typeErasure2("Sam")
println(te2.getData())
}
class typeErasure<I>(name : I){
private val data : I = name
fun getData() : I = data
}
class typeErasure2<I>(name : I){
val data : I = name // error 1
fun getData() : I = data // error 2
}当我使用private关键字时,程序可以运行,否则会出现错误。谁能给我解释一下?:)
发布于 2020-11-09 18:41:03
Kotlin的属性逻辑与Java的字段略有不同。
无论何时在类中声明任何变量,都会自动生成它的getter和getter,并且可以在声明之后使用get()或set {}对它们进行自定义。
手动声明getVariable()将导致平台冲突,因为已经为变量声明中的字段定义了getter,并且您正在创建具有相同名称的函数。
您可以使用@JvmField注释来指示编译器不为该字段生成任何getter或setter。
@JvmField
val data: I = name
fun getData(): I = data发布于 2020-11-09 16:49:21
这与泛型无关。你的代码的问题是
public fun getData(): I是"data“的访问者。但是当"data“是公共字段时,则访问器是冗余的。所以当你这样做的时候:
val someValue = myObject.data那么编译器就无法判断它是应该使用访问器getData(),还是应该直接指向该字段。
当getData为私有时,编译器清楚地知道它不能使用它,因此它将直接指向该字段。
class typeErasure2<I>(name : I){
val data : I = name
fun getData() : I = data
}
fun main() {
val obj = typeErasure2<Int>(123)
println(obj.data) // <--- Ask yourself, what does this line do exactly?
}class typeErasure2<I>(name : I){
val data : I = name
private fun getData() : I = data
}
fun main() {
val obj = typeErasure2<Int>(123)
println(obj.data) // <--- Here it is clear
// it is not the "getData" because that one is private,
// so it must be the public field "data" you are pointing to
}https://stackoverflow.com/questions/64748367
复制相似问题