如果第一个操作数不是你的对象,如何覆盖任何运算符

时间:2018-04-22 13:38:40

标签: kotlin

我试试了Kotlin,因为它应该是一个没有某些限制的java,例如检查异常或者不支持运算符覆盖(当然这些限制使它们存在权利,例如减少滥用或强制冗长,但这个问题并不是他们应该(不)存在的原因。所以我写了一个简单的Vector2类,它应该支持像+ - * /。

这样的基本运算符

当您的第一个和第二个操作数都来自Vector2类型时,没有问题,但是当第一个操作数不是来自类型Vector2时,会出现问题。举个例子:

fun main(args: Array<String>) {
    val vector = Vector2(2.0, 3.0) * 2.0
}

由于Vector2

中的这种方法,这种方式完美无缺
operator fun times(d: Double) = Vector2(x * d, y * d)

但如果这两个操作数改变了这样的地方,我应该怎么做:

fun main(args: Array<String>) {
    val vector = 2.0  * Vector2(2.0, 3.0)
}

我虽然对times()类型的Double运算符重载:

// In 'Vector2.kt'
operator fun Double.times(vector: Vector2) = ...

但我不知道如何检索double值以将其与向量相乘。

有人可以帮忙吗?提前谢谢!

1 个答案:

答案 0 :(得分:2)

定义extension function时,接收者(调用函数的对象)始终以this的形式提供给实现主体。

operator fun Double.times(vector: Vector2): Vector2 = vector * this

你可以用任何你想要的方式实现,我只是颠倒了操作数来缩短这个例子。