Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 当don';";“私人”;_Kotlin - Fatal编程技术网

Kotlin 当don';";“私人”;

Kotlin 当don';";“私人”;,kotlin,Kotlin,当我将用户名设置为公共时出错的原因: 错误:(2,5)Kotlin:平台声明冲突:以下 声明具有相同的JVM签名 (getUserName()Ljava/lang/String;): fun():在User中定义的字符串 fun getUserName():在用户中定义的字符串 错误:(4,5)Kotlin:平台声明冲突:以下声明具有相同的 JVM签名(getUserName()Ljava/lang/String;): fun():在User中定义的字符串 fun getUserName():在

当我将用户名设置为公共时出错的原因:

错误:(2,5)Kotlin:平台声明冲突:以下 声明具有相同的JVM签名 (getUserName()Ljava/lang/String;): fun():在User中定义的字符串 fun getUserName():在用户中定义的字符串

错误:(4,5)Kotlin:平台声明冲突:以下声明具有相同的 JVM签名(getUserName()Ljava/lang/String;): fun():在User中定义的字符串 fun getUserName():在用户中定义的字符串

但我认为用户名是私有的,工作正常

 class User{
            /*private*/ var userName: String = "Emily"

            fun getUserName(): String{
                return userName
            }
        }

        fun main(args: Array<String>){
            val User = User()
            print(User.getUserName())
        }
类用户{
/*private*/var用户名:String=“Emily”
fun getUserName():字符串{
返回用户名
}
}
趣味主线(args:Array){
val User=User()
打印(User.getUserName())
}

当您定义
var userName
时,您不仅仅是一个字段。该属性附带一个隐式的
getUserName()
setUserName()
方法。通过添加您自己的
getUserName()
,您正在跟踪Kotlin为您自动创建的一个

您可以安全地删除
getUserName()
,并将字段设置为非私有字段,它应该可以正常工作。编写代码的惯用方法如下:

class User {
    var userName: String = "Emily"
}

fun main(args: Array<String>){
    val user = User()    // Note changed val from User to user.
    print(user.userName) // Note, this really calls the getter
}
private var _userName: String = "Emily"
var userName: String
    get() = _userName.toLowerCase()
    set(value) { _userName = value }
类用户{
var用户名:String=“Emily”
}
趣味主线(args:Array){
val user=user()//注意,用户之间的val已更改。
print(user.userName)//注意,这实际上调用了getter
}

在Kotlin中,正在为每个属性创建一个setter和getter(除非可见性禁止),例如为您的
用户名创建一个setter和getter,该用户名恰好与您另外提供的名称完全相同:
getUserName()
。结果是名称冲突。请注意,对于
var
,也会生成设置器。对只读属性使用
val

实际上,您不需要像这样的显式getter。简单地做:

class User{
    /*private*/ var userName: String = "Emily"
}

//use property syntax
val user = User()
print(user.userName)

通过将您的
userName
属性
公开
,Kotlin将为您创建相应的
getUserName()
setUserName()
函数。当它这样做时,编写自己的
getUserName()
是多余的-具有相同签名的同一函数实际上存在两次-编译器不允许这样做

如果希望
userName
字段成为公共属性(使用生成的getter和setter),那么您也不能自己编写getter。这就足够了:

var userName: String = "Emily"
如果您希望
userName
具有
public
getter和
private
setter(这似乎是您想要的),这是Kotlin的方法:

var userName: String = "Emily"
    private set
最后,您仍然可以在属性上创建自定义访问器(例如,如果您需要额外的逻辑,例如以小写形式返回)。Kotlin的方法如下所示:

class User {
    var userName: String = "Emily"
}

fun main(args: Array<String>){
    val user = User()    // Note changed val from User to user.
    print(user.userName) // Note, this really calls the getter
}
private var _userName: String = "Emily"
var userName: String
    get() = _userName.toLowerCase()
    set(value) { _userName = value }

另外,请注意,您访问属性的方式是不同的,这取决于您是从Kotlin还是Java访问它。在Kotlin中,您只需编写
user.userName
,但在Java中,您需要编写
user.getUserName()

,我只想添加更多关于
private
字段的信息。当您使用
private
修饰符声明字段时,Kotlin不会生成getter/setter

class User {

    private var userName = "Na"

    fun getUserName(): String {
        return userName;
    }

    fun setUserName(v: String) {
        userName = v
    }

}

当您声明上述方法(getter和setter)时,这些方法将被视为用户定义的方法。

我理解。非常感谢,非常感谢。多谢各位much@halfer对于下一篇文章,我会记住这一点,并尝试编辑我以前的文章。谢谢