代码之家  ›  专栏  ›  技术社区  ›  mducc

如果不是“private”,则无法在Kotlin中返回字符串

  •  2
  • mducc  · 技术社区  · 8 年前

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

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

    错误:(4,5)Kotlin:平台声明冲突:以下声明具有相同的 JVM签名(getUserName()Ljava/lang/String;): fun():在用户中定义的字符串 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())
            }
    
    4 回复  |  直到 8 年前
        1
  •  4
  •   Dave Leeds    8 年前

    通过使 userName 所有物 public ,Kotlin将创建相应的 getUserName() setUserName() 为您提供的功能。当它这样做的时候,写你自己的 getUserName() 是冗余的-具有相同签名的相同函数有效地存在两次-编译器不允许这样做。

    如果你想要 用户名 字段是公共属性(具有生成的getter和setter),那么您也不能自己编写getter。这就足够了:

    var userName: String = "Emily"
    

    如果你愿意的话 用户名 有一个 平民的 getter和a private setter(这似乎是您想要的),这是Kotlin的方法:

    var userName: String = "Emily"
        private set
    

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

    private var _userName: String = "Emily"
    var userName: String
        get() = _userName.toLowerCase()
        set(value) { _userName = value }
    

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

        2
  •  1
  •   Todd    8 年前

    定义时 var userName 你是 really defining a property ,而不仅仅是一个字段。随着属性的出现 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
    }
    
        3
  •  1
  •   s1m0nw1    8 年前

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

    实际上,你不需要像这样的显式getter。只需执行以下操作:

    class User{
        /*private*/ var userName: String = "Emily"
    }
    
    //use property syntax
    val user = User()
    print(user.userName)
    
        4
  •  1
  •   halfer Jatin Pandey    8 年前

    我只是想补充一下 private 领域当您用声明字段时 私有的 修饰符,Kotlin不会生成getter/setter

    class User {
    
        private var userName = "Na"
    
        fun getUserName(): String {
            return userName;
        }
    
        fun setUserName(v: String) {
            userName = v
        }
    
    }
    

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