gpt4 book ai didi

kotlin - "overloading"中的 "operator overloading"只是语义吗?

转载 作者:行者123 更新时间:2023-12-02 07:14:51 24 4
gpt4 key购买 nike

Kotlin 是允许我们轻松定义各种预定义运算符行为的语言之一,该操作名为运算符重载 - https://kotlinlang.org/docs/reference/operator-overloading.html

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

从我所看到的默认情况来看,该语言仅声明基本类型的运算符 - 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 .

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

最佳答案

看起来您对一般运算符感到困惑。

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

您可以在源代码中找到有关此问题的答案。如果我们看一下测试,我们可以找到 following :

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

遗憾的是,我找不到运算符转换的源代码,但可以肯定的是,这一定是运算符重载被函数调用替换的过程。

关于kotlin - "overloading"中的 "operator overloading"只是语义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59045539/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com