Kotlin中期望属性的getter或setter函数

10

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

class Sum {

    var a: Int, b: Int;

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

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

我有这个类,现在我想创建一个该类的对象,类似于

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

我在Sum类中遇到了以下错误:

期望属性的getter或setter

出现在var a: Int, b: Int;这一行中的b: int;


1
阅读 https://kotlinlang.org/docs/reference/basic-syntax.html - IntelliJ Amiya
6个回答

15
var a: Int, b: Int;

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

var a: Int
var b: Int

相反,Kotlin团队并不支持C/Java中“int a, b, ..”这样的写法。


1
变量必须被初始化。这个语句会在编译时出错。 - Sachin Chandil
尝试将您的代码放入IDE中,您就会知道。它会给出编译时错误“属性必须初始化”。 - Sachin Chandil
我正在使用带有最新Kotlin 1.1.2-4的Android Studio 3.0,它会产生上述编译时错误。 - Sachin Chandil
你的代码不是我所说的。再次强调:像 OP 一样使用 Sum 类。因为他在那里有一个初始化这两个字段的构造函数!对不起,那是误导性的。只有 Sum { a b } 当然不行。但是有了构造函数就可以正常工作! - GhostCat

9

你的类中写了不必要的代码。

如果只有一个构造函数,请使用缩写形式。

如果类中有属性,可以在构造函数中使用valvar进行定义。

使用示例如下:

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

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

请阅读Kotlin基本语法


6
您遇到的错误可以通过将变量分别声明在两行中来解决:
var a: Int
var b: Int

然而,如果你只想要一个带参数的构造函数来集成这些变量,推荐的方法是:

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

3
首先,你必须将属性声明放在单独的行上。您可以参考这个帖子,JetBrains工程师yole在其中表示:
声明多个属性在同一行上,在许多Java样式指南中都不受欢迎,因此我们没有在Kotlin中实现对其的支持。
一旦属性声明分别放置在各自的行上,应该就不会有问题了,因为Kotlin会在内部生成具有与您的属性相同可见性的默认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

1
以下代码展示了如何在类中赋值和操作变量。
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())
}

0

这个错误是因为

  • 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
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接