我正在创建一个 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 类?
首先,您需要注意
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>
并且编译器知道枚举的类型。