今天开始学习Scala,我很好奇您是否可以重载函数以添加curring,例如:
def add(x: Int, y: Int): Int = x + y
def add(x: Int)(y: Int): Int = x + y
但是,不仅此代码无法编译,而且我听说Scala中的重载不是一个好主意。
有没有办法超载加,使得它没有做部分应用程序,这意味着既咖喱add(1, 2)
和add(1)(2)
工作?
问题在于,add
在删除JVM类型之后,这些功能是无法区分的:在执行期间,它们都是(Int, Int)Int
。但是它们在编译过程中有所不同,Scala编译器可以告诉您要调用的是哪一个。
这意味着您必须使他们的参数列表有所不同。为此,您可以添加带有参数的隐式参数列表DummyImplicit
:
def add(x: Int, y: Int)(implicit dummy: DummyImplicit): Int = x + y
def add(x: Int)(y: Int): Int = x + y
这DummyImplicit
是由Scala库提供的,并且始终有一个隐式值。现在,擦除后的第一个函数的类型为(Int, Int, DummyImplicit)Int
,第二个函数的类型为(Int, Int)Int
,因此JVM可以区分它们。
现在您可以同时调用两者:
add(1, 2)
add(1)(2)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句