我正在创建一个 Kotlin 结构,打算在几款 Android 游戏中重复使用,格式类似:一个网格,多个单元格。根据游戏的不同,单元格将具有不同的可能状态集。状态集将是一个枚举,但内容会因游戏而异。
所以我想要一个像这样的结构:
class Cell(state: Enum) {
...
}
每个游戏的参数state
都会有所不同。
例如,
enum class TicTacToeState{
BLANK, X, O
}
val cell = Cell(TicTacToeState.BLANK)
或者
enum class SeaBattleState{
BLANK, END, SUB, WATER
}
val cell = Cell(SeaBattleState.SUB)
问题是,当我在顶部输入结构时,Android Studio 告诉我“类 Enum<E : Enum> 需要一个类型参数”。
我无法想象我应该将枚举称为什么类型,因为我不知道内容是什么,也不知道在枚举值的上下文中“BLANK”是什么类型。我在 Google 和这里搜索过,但找不到任何页面处理带有类型Enum
声明的类名,而不是使用小写字母enum
将类声明为枚举。
所以我的问题是,当我还不知道枚举是什么时,如何声明一个具有枚举类型参数的 Kotlin 类?
首先,你需要知道
Enum
Java/Kotlin 中的类型一开始有点令人困惑,因为它是针对自身进行参数化的。这给我们原本以为简单的情况增加了一些复杂性。如果我们不关心枚举的具体类型,我们可以使用
Enum<*>
:这与您的代码直接等同。
但是,这不是很有用。如果我们有一个
Cell
,我们可以得到它的枚举值,我们可以检查枚举的序数和名称,但我们不知道这个枚举类型到底是什么,我们不能when
轻松地在其上切换/,等等:在上述情况下,IntelliJ 不会帮助我们找到状态的可能值。此外,上述代码无法编译,因为编译器无法理解是否
when
详尽无遗。我们必须TicTacToeState
手动转换为。为了知道枚举类型,我们必须创建泛型
Cell
。但是,由于开头所说的内容,这比平常要复杂一些。我们必须创建一个类型参数,该参数是针对相同类型的枚举。做起来比解释起来容易:通过此代码,我们不只是得到了一个
Cell
,Cell<TicTacToeState>
而且我们还有编译器知道的枚举类型。