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。
那么,在两种机制之间-运算符重载和方法重载,除了不幸的名称冲突之外,真的没有任何联系吗?
答案 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
遗憾的是,我找不到在其中转换运算符的源代码,但是最肯定的是,这一定是将运算符重载替换为函数调用的过程。