Kotlin 当don';";“私人”;
当我将用户名设置为公共时出错的原因: 错误:(2,5)Kotlin:平台声明冲突:以下 声明具有相同的JVM签名 (getUserName()Ljava/lang/String;): fun():在User中定义的字符串 fun getUserName():在用户中定义的字符串 错误:(4,5)Kotlin:平台声明冲突:以下声明具有相同的 JVM签名(getUserName()Ljava/lang/String;): fun():在User中定义的字符串 fun getUserName():在用户中定义的字符串 但我认为用户名是私有的,工作正常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():在
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对于下一篇文章,我会记住这一点,并尝试编辑我以前的文章。谢谢