【问题标题】:how to instantiate an object from a class in kotlin如何从kotlin中的类实例化对象
【发布时间】:2019-02-14 03:54:18
【问题描述】:

我正在学习 Kotlin,我在 google 上搜索了如何在 kotlin 中创建一个类。所以,我创建了下面的类作为测试。 在主要活动中,我试图从 Board 类实例化一个对象,但出现以下错误:

classifier Board does not have a companion object

请告诉我如何实例化类 Board 的对象?

MainActivity

class ActMain : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.layout_act_main)

    Board board = new Board(name = "ABC");
}
}

Board.kt

data class Board(val name: String) {
    var age: Int = 0
}

【问题讨论】:

  • 这不是有效的 Kotlin

标签: android kotlin kotlin-android-extensions kotlin-extension


【解决方案1】:

Kotlin 不使用new

Board board = new Board(name = "ABC");

不正确。使用

val board = Board("ABC")

您的代码反映了 Java 语法...有点。 Kotlin 具有类型推断功能,因此您无需指定类类型。但是,如果您指定它,它与 Java 不同:

val board: Board = Board("ABC")

在 Kotlin 中通常也不使用分号,尽管如果使用它们不会破坏编译。

name = "ABC" 只是无效的语法,无论是 Java 还是 Kotlin。 实际上它是(来自@hotkey):https://kotlinlang.org/docs/reference/functions.html#named-arguments

【讨论】:

  • name = "ABC" 实际上是在 Kotlin 中传递参数的正确方法,请参阅语言参考中的 Functions / Named Arguments
  • 在一行代码中放置多个语句或表达式时,Kotlin 中需要使用分号。
【解决方案2】:

与 Java 不同,在 Kotlin 中这是正确的方式

MainActivity.kt

class ActMain : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.layout_act_main)

        val board = Board("ABC")
        board.age = 12
    }
}

Board.kt

class Board(val name: String) {
    var age: Int = 0
}

【讨论】:

    【解决方案3】:

    试着忘记java

    val board = Board("name")
    

    【讨论】:

      【解决方案4】:

      在科特林中

      当你想声明新对象时,你可以这样做。

      val board = Board("ABC")
      

      如果您使用 val 关键字声明对象。它看起来就像您在 java 中使用 final 一样。您声明的变量无法重新创建。

      var board = Board("ABC")
      

      如果你使用 var 来声明它在 java 中看起来像普通变量

      无论如何,在 kotlin 中你会看到一些它在 java 中不包含的东西,例如 范围功能如下面的链接。它将帮助您更轻松地编写代码。

      https://kotlin.guide/scoping-functions

      希望对你有所帮助:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多