繁体   English   中英

Kotlin 中预期的属性 getter 或 setter

[英]Property getter or setter expected in Kotlin

我正在从官方文档中学习Kotlin ,我正在尝试创建一个 class 来进行算术运算。

class Sum {

    var a: Int, b: Int;

    constructor(a: Int, b: Int) {
        this.a = a
        this.b = b
    }

    fun add(): Int {
        return a + b
    }
}

我有这个 class,现在我想创建一个 class 的 object

val sum = Sum(1,2)
Log.d("Sum", sum.add())

我在Sum class 中收到此错误:

期望属性 getter 或 setter

b: int; 在行内var a: Int, b: Int;

var a: Int, b: Int;

Kotlin不允许在一行中有多个声明。 你必须去:

var a: Int
var b: Int

代替。 Kotlin人员简单地发现C / java实践中的“int a,b,..”是他们希望在Kotlin中支持的东西。

您只需将变量声明为两行即可解决错误:

var a: Int
var b: Int

但是,建议的方法是将这些变量集成到构造函数中(如果您只想拥有一个带参数的构造函数):

class Sum(var a: Int, var b: Int) {
    fun add(): Int = a + b
}

您正在课堂上编写不必要的代码。

如果只有一个,请为constructor编写简短形式。

如果类中有属性,则可以使用valvarconstructor定义它们。

使用如下:

class Sum (var a: Int,var b: Int){

    fun add(): Int {
        return a + b
    }
}

请阅读Kotlin 基本语法

以下代码显示了如何在类中分配和操作变量

class Sum (var a: Int,var b: Int){

    fun add(): Int= a + b //you can return the results directly.
}

您可以使用下面的主要测试您的代码。

fun main(args: Array<String>) {
   var s= Sum(1,2)

    print(s.add())
}

首先,您必须将属性声明放在​​单独的行上。 你可以在这里引用这个帖子 ,JetBrains的工程师yole说:

许多Java样式指南都不赞成在同一行上声明多个属性,因此我们没有在Kotlin中实现对该属性的支持。

一旦完成了单独行上的属性声明,你应该没有问题,因为kotlin genrates默认的getter和setter在内部具有与你的属性相同的可见性。 如果未指定任何可见性修饰符,则默认使用public,这意味着您的声明将随处可见。

事实上,Kotlin有一个简洁的语法,用于声明属性并从主构造函数初始化它们(如果你只有一个构造函数,它将始终是主要的):

  class Sum(var a:Int,var b:Int) {

    fun add(): Int {
        return a + b
    }
}

请参阅以下链接https://kotlinlang.org/docs/reference/classes.html中的官方文档中的构造函数列

出现此错误是因为

  • Kotlin 如果您在同一行声明甚至初始化 2 个字段变量,则不支持

  • kotlin中每个字段变量都有默认的setter和getter关联

因此,当您在同一行声明它们时,第一个变量使用默认的 setter 和 getter 初始化,但另一个变量期望您提供自己的 setter 和 getter,因为语法错误

错误可以通过两种方式解决

  • 像这样分别声明setter和getter

     var a:Int get() { return 0 } set(value) { val b = value }
  • 更正语法

     var a: Int var b: Int

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM