Scala中的方法重载
方法重载是实现多态的常用方法。它是一种以多种形式重新定义函数的能力。用户可以通过在同名的类中定义两个或多个函数来实现函数重载。 Scala 可以区分具有不同方法签名的方法。即同一类中的方法可以具有相同的名称但具有不同的参数列表(即参数的数量、参数的顺序和参数的数据类型)。
- 重载方法根据作为参数传递给方法的参数的数量和类型进行区分。
- 我们不能定义多个具有相同名称、Order 和参数类型的方法。这将是一个编译器错误。
- 编译器在区分重载方法时不考虑返回类型。但是您不能声明具有相同签名和不同返回类型的两个方法。它将引发编译时错误。
为什么我们需要方法重载?
如果我们需要以不同的方式(即针对不同的输入)执行相同类型的操作。在下面描述的示例中,我们正在对不同的输入进行加法运算。很难为单个动作找到许多不同的有意义的名称。
重载方法的不同方式
方法重载可以通过改变来完成:
- 两种方法的参数个数。
- 方法参数的数据类型。
- 方法参数的顺序。
通过改变参数的数量。
例子:
// Scala program to demonstrate the function
// overloading by changing the number
// of parameters
class GFG
{
// function 1 with two parameters
def fun(p:Int, q:Int)
{
var Sum = p + q;
println("Sum in function 1 is:" + Sum);
}
// function 2 with three parameters
def fun(p:Int, q:Int, r:Int)
{
var Sum = p + q + r;
println("Sum in function 2 is:" + Sum);
}
}
object Main
{
// Main function
def main(args: Array[String])
{
// Creating object of GFG class
var obj = new GFG();
obj.fun(6, 8);
obj.fun(5, 10, 58);
}
}
输出:
Sum in function 1 is:14
Sum in function 2 is:73
通过更改参数的数据类型
例子:
// Scala program to demonstrate the function
// overloading by changing the data types
// of the parameters
class GFG
{
// Adding three integer elements
def fun(p:Int, q:Int, r:Int)
{
var Sum = p + q + r;
println("Sum in function 1 is:"+Sum);
}
// Adding three double elements
def fun(p:Double, q:Double, r:Double)
{
var Sum = p + q + r;
println("Sum in function 2 is:"+Sum);
}
}
object Main
{
// Main method
def main(args: Array[String])
{
// Creating object of GFG class
var obj = new GFG();
obj.fun(6, 8, 10);
obj.fun(5.9, 10.01, 58.7);
}
}
输出:
Sum in function 1 is:24
Sum in function 2 is:74.61
通过改变参数的顺序
例子:
// Scala program to demonstrate the function
// overloading by changing the
// order of the parameters
class GFG
{
// Function 1
def fun(name:String, No:Int)
{
println("Name of the watch company is:" + name);
println("Total number of watch :" + No);
}
// Function 2
def fun(No:Int, name:String )
{
println("Name of the watch company is:" + name);
println("Total number of watch :" + No);
}
}
object Main
{
// Main Function
def main(args: Array[String])
{
// Creating object of GFG class
var obj = new GFG();
obj.fun("Rolex", 10);
obj.fun("Omega", 10);
}
}
输出:
Name of the watch company is:Rolex
Total number of watch :10
Name of the watch company is:Omega
Total number of watch :10
当方法签名相同而返回类型不同时会发生什么?
编译器将给出错误,因为仅返回值不足以让编译器确定它必须调用哪个函数。只有当两个方法具有不同的参数类型(因此,它们具有不同的签名)时,才可能进行方法重载。
例子:
// Example to show error when method signature is same
// and return type is different.
object Main {
// Main method
def main(args: Array[String]) {
println("Sum in function 1 is:" + fun(6, 8) );
println("Sum in function 2 is:" + fun(6, 8) );
}
// function 1
def fun(p:Int, q:Int) : Int = {
var Sum: Int = p + q;
return Sum;
}
// function 2
def fun(p:Int, q:Int) : Double = {
var Sum: Double = p + q + 3.7;
return Sum;
}
}
编译时错误:
prog.scala:10: error: ambiguous reference to overloaded definition,
both method fun in object Main of type (p: Int, q: Int)Double
and method fun in object Main of type (p: Int, q: Int)Int
match argument types (Int,Int) and expected result type Any
println(“Sum in function 1 is:” + fun(6, 8) );
^
prog.scala:11: error: ambiguous reference to overloaded definition,
both method fun in object Main of type (p: Int, q: Int)Double
and method fun in object Main of type (p: Int, q: Int)Int
match argument types (Int,Int) and expected result type Any
println(“Sum in function 2 is:” + fun(6, 8) );
^
prog.scala:22: error: method fun is defined twice
conflicting symbols both originated in file ‘prog.scala’
def fun(p:Int, q:Int) : Double = {
^
three errors found