Kotlin 是";超载“;在;运算符重载";只是语义?

Kotlin 是";超载“;在;运算符重载";只是语义?,kotlin,idioms,Kotlin,Idioms,Kotlin是允许我们轻松定义各种预定义运算符行为的语言之一,操作名为运算符重载 我的问题是关于操作的重载部分 从我看到的默认值来看,该语言只声明基本类型的运算符- 如果我读得正确,我们的自定义类型将不会有任何这种特殊的方法-默认情况下可用的运算符。事实上,如果我们要尝试 class A { } val a = A() System.out.println(a + a) 编译器会试图找到一个合适的操作符和方法来调用,但最终会给出一个编译错误 但是如果我们声明了自己的操作符加上方法 class

Kotlin是允许我们轻松定义各种预定义运算符行为的语言之一,操作名为
运算符重载

我的问题是关于操作的
重载部分

从我看到的默认值来看,该语言只声明基本类型的运算符-

如果我读得正确,我们的自定义类型将不会有任何这种特殊的方法-默认情况下可用的运算符。事实上,如果我们要尝试

class A { }
val a = A()
System.out.println(a + a)
编译器会试图找到一个合适的
操作符和
方法来调用,但最终会给出一个编译错误

但是如果我们声明了自己的
操作符加上
方法

class A { 
    operator fun plus(other: A) = "Hello!"
}
val a = A()
System.out.println(a + a)
我们真的会打印“你好!”

上面的机制称为“操作符重载”,但如果没有以前的同名方法,我们实际上不会使用我们都习惯的OOP方法重载-


因此,在运算符重载和方法重载这两种机制之间,除了一个不幸的名称冲突之外,实际上没有任何联系?

看起来您对运算符的理解大体上是混乱的

关于操作符的一点是,它们只是内联的函数,操作符关键字只是一种语言构造,让您能够使用类对操作符进行分组

在那里你可以找到答案,这肯定是源代码。如果我们查看这些测试,我们可以发现:


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

函数重载是一个概念,可以在OOP之外应用于免费函数。如果你把操作符+看作是一个自由函数,那么我认为它不是一个完全独立的概念。你的问题中缺少了一个关键的东西。您一般如何定义“重载”?我的工作定义是“为不同类型的操作数赋予名称或符号不同的含义”。那么,操作符重载和方法重载真的不同吗?我不知道在Kotlin中重载是如何工作的,但是您也标记了问题C++,并且C++中可以像操作符一样正常地重载操作符。而且,与普通函数一样,您需要声明它们。但是我不确定你的问题是,你的类a是否应该有一个默认的操作符+?“但是如果没有一个同名的前一个方法”,这个方法不是叫做“操作符+”吗?有许多不同的函数具有相同的名称,不同之处在于它们采用不同的变量。@Mugurel:“对于运算符重载,我看不到已经存在的方法。”但您确实看到了。您可以通过编译器提供的函数将两种不同类型的内容添加到一起。这些都是已经存在的方法。
// "Create local variable '-'" "false"
// ACTION: Create extension function 'A.minus'
// ACTION: Create member function 'A.minus'
// ACTION: Replace overloaded operator with function call