Scala 类型推理
Scala类型推理使得指定变量的类型成为可有可无的事情,但类型不匹配的情况会被处理。有了类型推断功能,我们可以花更少的时间来写出编译器已经知道的东西。Scala编译器通常可以推断出一个表达式的类型,所以我们不必明确地声明它。让我们先来看看scala中如何声明不可变的变量的语法。
val variable_name : Scala_data_type = value
例子
// Scala program of type interference
object Geeks
{
// Main method
def main(args: Array[String])
{
// prints a double value
val a : Double = 7.893
println(a)
println(a.getClass)
}
}
输出:
7.893
double
在上面的例子中,getClass方法被用来打印变量的类型到控制台。在上面的例子中,变量’a’的类型是double。然而,通过类型推理,Scala会自动检测变量的类型,而无需用户明确指定。
例子:
// Scala program of type interference
object Geeks {
// Main method
def main(args: Array[String])
{
// type inference
println("Scala Data Types")
val number = 5
val big_number = 100000000L
val small_number = 1
val double_number = 2.50
val float_number = 2.50f
val string_of_characters = "This is a string of characters"
val byte = 0xc
val character = 'D'
val empty = ()
println(number)
println(big_number)
println(small_number)
println(double_number)
println(float_number)
println(string_of_characters)
println(byte)
println(character)
println(empty)
}
}
输出:
Scala Data Types
5
100000000
1
2.5
2.5
This is a string of characters
12
D
()
请注意,上述变量没有明确指定数据类型。 Scala函数的类型推理 现在我们来看看Scala中函数的类型推理是如何进行的。首先让我们来看看Scala中的函数是如何声明的。
语法
def function_name ([parameter_list]) : [return_type] = {
// function body
}
例子 :
// Scala program of multiply two numbers
object Geeks
{
// Main method
def main(args: Array[String])
{
// Calling the function
println("Product of the two numbers is: " + Prod(5, 3));
}
// declaration and definition of Product function
def Prod(x:Int, y:Int) : Int =
{
return x*y
}
}
输出:
Product of the two numbers is: 15
在上面的例子中,我们可以从声明中看到,指定的返回类型是Int。通过Scala类型推理,Scala会自动检测出函数的类型,而不需要用户明确指定。
例子:
// Scala program of type interference
object Geeks
{
def factorial(n: Int)= {
var f = 1
for(i <- 1 to n)
{
f = f * i;
}
f
}
// Driver Code
def main(args: Array[String])
{
println(factorial(5))
}
}
输出:
120
def factorial(n: Int)=
在上面的例子中,省略了冒号和返回类型。另外,在上面的例子中,我们省略了 “return f “到 “f “的语句,因为我们没有指定返回类型。如果把 “f “改为 “return f”,那么编译器会显示以下错误。
prog.scala:11: error: method factorial has return statement; needs result type
return f
^
这显示了Scala类型推理的强大功能,但对于递归方法,编译器无法推断出结果类型。上述阶乘函数也可以以递归方式实现。下面是一个没有类型推理的阶乘函数的递归定义。
例子:
// Scala program of using recursion
object Geeks {
// factorial function
def factorial(n: Int): Int =
{
if (n == 0)
return 1
else
return n * factorial(n-1)
}
// Driver Code
def main(args: Array[String])
{
println(factorial(5))
}
}
输出:
120
示例: 使用Scala类型推理
// Scala program of type interference
object Geeks
{
// Defining function with type interference
def factorial(n: Int) =
{
if (n == 0)
1
else
n * factorial(n-1)
}
// Driver Code
def main(args: Array[String])
{
println(factorial(5))
}
}
输出
Compile Errors :
prog.scala:8: error: recursive method factorial needs result type
n * factorial(n-1)
^