运算符重载作为扩展函数

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

在我的游戏中我有两个玩家,所以我定义了一个对的类型,应该表明我有两个相同类型的东西,.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的一个类型参数'。

但我无法弄清楚在这种情况下这意味着什么。

kotlin
1个回答
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
}
© www.soinside.com 2019 - 2024. All rights reserved.