在我的游戏中,我有两个玩家,因此我定义了一个成对的类型别名,应该表示我有两个相同类型的事物,.first
属于玩家一,.second
属于玩家二:
typealias PlayerPair<A> = Pair<A, A>
我也定义了这个枚举类
enum class PlayerNumber {
One,
Two
}
现在,我想添加一个运算符(作为扩展功能)以访问此类元素
myPair[Player.One]
那是我的做法,但是不起作用
operator fun PlayerPair.get(i: PlayerNumber) = when (i) {
PlayerNumber.One -> PlayerPair.first
PlayerNumber.Two -> PlayerPair.sexond
}
添加else分支可以消除一个错误,但是我不明白为什么这样做是必要的。
另一个错误是“类型别名PlayerPair = Pair应该具有一个类型参数”。
但是在这种情况下,我不知道这意味着什么。
答案 0 :(得分:3)
您可以创建通用的get
函数,只需指定类型参数,然后扩展PlayerPair<T>
:
operator fun <T> PlayerPair<T>.get(i: PlayerNumber): T = when (i) {
PlayerNumber.One -> this.first
PlayerNumber.Two -> this.second
}
在运算符内部,您可以将PlayerPair<T>
的实例称为this
,也可以隐式使用它:
operator fun <T> PlayerPair<T>.get(i: PlayerNumber): T = when (i) {
PlayerNumber.One -> first
PlayerNumber.Two -> second
}