运算符重载作为扩展功能

时间:2019-02-24 14:08:27

标签: kotlin

在我的游戏中,我有两个玩家,因此我定义了一个成对的类型别名,应该表示我有两个相同类型的事物,.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应该具有一个类型参数”。

但是在这种情况下,我不知道这意味着什么。

1 个答案:

答案 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
}