在Scala中,方法可以和值一样可以被类型参数化。这样写的语法跟泛型很像。类型参数用中括号包着,值参数则是用小括号包着。
下面就是例子:
def listOfDuplicates[A](x: A, length: Int): List[A] = { if (length < 1) Nil else x :: listOfDuplicates(x, length - 1) } println(listOfDuplicates[Int](3, 4)) // List(3, 3, 3, 3) println(listOfDuplicates("La", 8)) // List(La, La, La, La, La, La, La, La)
该方法listOfDuplicates
采用类型参数A
和值参数x
以及length
。值x
是类型A
。如果length < 1
我们返回一个空列表。否则,我们x
将放在递归调用返回的重复项列表的前面。(请注意,这::
意味着将左侧的元素添加到右侧的列表之前。)
在第一个示例调用中,我们通过编写显式提供了type参数[Int]
。因此,第一个参数必须为Int
,返回类型为List[Int]
。
第二个示例调用显示您不必总是显式提供type参数。编译器通常可以根据上下文或值参数的类型进行推断。在此示例中,"La"
是,String
因此编译器知道A
必须是String
。