在Kotlin中,如何声明具有Enum属性的类?

问题描述 投票:0回答:1

我正在创建一个 Kotlin 结构,打算在几个具有类似格式的 Android 游戏中重用该结构:具有多个单元格的单个网格,并且根据游戏的不同,单元格将具有一组不同的可能状态。状态集将是一个枚举,但内容会因游戏而异。

所以我想要一个像这样的结构:

class Cell(state: Enum) {
    ...
}

其中

state
参数对于每个游戏都会有所不同。

举个例子,

enum class TicTacToeState{
    BLANK, X, O
}

var cell = Cell(TicTacToeState.BLANK)

enum class SeaBattleState{
    BLANK, END, SUB, WATER
}

var cell = Cell(SeaBattleState.SUB)

问题是,当我在顶部键入结构时,Android Studio 告诉我,“类 Enum 需要一个类型参数”。

我无法想象应该将 Enum 称为什么类型,因为我不知道内容是什么,甚至也不知道 ENUM 值的上下文中的“BLANK”类型是什么。我已经搜索了 Google 和此处,但找不到任何使用类型声明处理类名

Enum
的页面,而不是使用小写
enum
将类声明为枚举。

所以我的问题是,当我还不知道 Enum 是什么时,如何声明带有 Enum 类型参数的 Kotlin 类?

kotlin class enums declaration
1个回答
0
投票

首先,您需要注意

Enum
类型在 Java/Kotlin 中一开始有点令人困惑,因为它是针对自身进行参数化的。这给我们期望简单的案例增加了一些复杂性。

如果我们不关心枚举的具体类型,我们可以使用

Enum<*>
:

class Cell(val state: Enum<*>)

这与您的代码直接等效。

但是,这并不是很有用。如果我们有一个

Cell
,我们可以获取它的枚举值,我们可以检查枚举的序数和名称,但是我们不知道这个枚举类型到底是什么,我们不能轻松地切换/
when
等:

val s = when (cell.state) {
    TicTacToeState.BLANK -> ""
    TicTacToeState.X -> "X"
    TicTacToeState.O -> "O"
}

在上述情况下,IntelliJ 不会帮助我们找到状态的可能值。另外,上面的代码无法编译,因为编译器不理解

when
是详尽的。我们必须手动投射到
TicTacToeState

为了了解枚举类型,我们必须将

Cell
设为泛型。然而,由于一开始所说的,这比平常要复杂一些。我们必须创建一个类型参数,它是针对相同类型的枚举。做起来比解释更容易:

class Cell<T : Enum<T>>(val state: T)

通过这段代码,我们不仅仅得到

Cell
,我们还得到
Cell<TicTacToeState>
并且编译器知道枚举的类型。

© www.soinside.com 2019 - 2024. All rights reserved.