“运算符重载”中的“重载”仅仅是语义上的吗?

时间:2019-11-26 07:10:52

标签: kotlin idioms

Kotlin是使我们能够轻松定义各种预定义运算符(称为operator overloading-https://kotlinlang.org/docs/reference/operator-overloading.html

)的行为的语言之一。

我的问题是关于操作的overloading部分。

从我所看到的默认语言中,该语言仅声明基本类型的运算符-https://github.com/JetBrains/kotlin/blob/01a613dca4042dde8d2374ff0e6610cb9eddc415/core/builtins/native/kotlin/Primitives.kt

如果我正确地阅读了此内容,那么我们的自定义类型将没有任何这种特殊方法-默认情况下可用的运算符。实际上,如果我们要尝试

class A { }
val a = A()
System.out.println(a + a)

编译器会尝试找到合适的operator plus方法来调用,但最终会给出编译错误。

但是如果我们声明自己的operator plus方法

class A { 
    operator fun plus(other: A) = "Hello!"
}
val a = A()
System.out.println(a + a)

我们确实会打个招呼!

以上机制称为“运算符重载”,但是没有以前的同名方法,我们实际上并不使用OOP方法重载,我们都习惯了-https://en.wikipedia.org/wiki/Function_overloading

那么,在两种机制之间-运算符重载和方法重载,除了不幸的名称冲突之外,真的没有任何联系吗?

1 个答案:

答案 0 :(得分:0)

看起来您通常对运算符感到困惑。

关于运算符的事情是它们只是内联函数,而operator关键字只是一种语言构造,使您能够将运算符与类进行分组。

可以在此找到答案的绝对是源代码。如果我们看一下测试,我们可以找到following

// "Create local variable '-'" "false"
// ACTION: Create extension function 'A.minus'
// ACTION: Create member function 'A.minus'
// ACTION: Replace overloaded operator with function call

遗憾的是,我找不到在其中转换运算符的源代码,但是最肯定的是,这一定是将运算符重载替换为函数调用的过程。