簡體   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