首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我有一个关于kotlin中的泛型的问题

我有一个关于kotlin中的泛型的问题
EN

Stack Overflow用户
提问于 2020-11-09 16:46:50
回答 2查看 57关注 0票数 0

我收到一个错误。如下所示:

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

代码语言:javascript
复制
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关键字时,程序可以运行,否则会出现错误。谁能给我解释一下?:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-09 18:41:03

Kotlin的属性逻辑与Java的字段略有不同。

无论何时在类中声明任何变量,都会自动生成它的getter和getter,并且可以在声明之后使用get()set {}对它们进行自定义。

手动声明getVariable()将导致平台冲突,因为已经为变量声明中的字段定义了getter,并且您正在创建具有相同名称的函数。

您可以使用@JvmField注释来指示编译器不为该字段生成任何getter或setter。

代码语言:javascript
复制
@JvmField
val data: I = name

fun getData(): I = data
票数 1
EN

Stack Overflow用户

发布于 2020-11-09 16:49:21

这与泛型无关。你的代码的问题是

代码语言:javascript
复制
public fun getData(): I

是"data“的访问者。但是当"data“是公共字段时,则访问器是冗余的。所以当你这样做的时候:

代码语言:javascript
复制
val someValue = myObject.data

那么编译器就无法判断它是应该使用访问器getData(),还是应该直接指向该字段。

getData为私有时,编译器清楚地知道它不能使用它,因此它将直接指向该字段。

代码语言:javascript
复制
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?
}
代码语言:javascript
复制
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
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64748367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档