文章目录
泛型就是不确定的类型,可以在类或方法不确实传入类型时使用,可以提高代码的灵活性和复用性。
scala中泛型的用法和java中差不多,但是会有一些自己独特的语法。
-
泛型类:指定类可以接受任意类型参数。
-
泛型方法:指定方法可以接受任意类型参数。
Scala泛类型
Scala中的泛型成为类型参数化。语法跟Java有所区别,使用"[]"表示类型,首先我们学习一下Scala泛型类的使用方式。
首先举一个例子,例如:class Pair[T, S] (val first: T, val second: S)
以上将定义一个带有两个类型参数T和S的类。在类的定义中,你可以用类型参数来定义变量、方法参数,以及返回值的类型。
带有一个或多个类型参数的类是泛型的。如果你把类型参数替换成实际的类型,将得到一个普通的类,比如Pair[Int, String],这非常方便。下面我们通过代码实例来了解掌握泛型类的知识。
我们将要通过泛型类实现一个基础数据结构——栈。首先新建一个Scala泛型类文件。
object LearnGenericClass {
class Stack[A] { //声明一个泛型类,我们用这个泛型类,来实现一个简单的“栈”,栈是一种非常基础的数据结构,遵循先进后出,后进先出的准则。
private var elements: List[A] = Nil //声明一个泛型List,首先将其置为
def push(x: A) {elements = x :: elements} //"::"符号代表将变量添加到List首部中,这行代码含义是将x添加到elements这个List中
def peek: A = elements.head //获取elements的头部元素
def pop(): A = { //将头部元素弹出,也就是所谓的出栈
val currentTop = peek
elements = elements.tail
currentTop
}
}
def main(args: Array[String]) {
val intStack = new Stack[Int] //声明一个用来存储Int变量的栈
intStack.push(1) //将两个元素入栈
intStack.push(2)
println(intStack.pop()) //将两个元素出栈
println(intStack.pop())
val stringStack = new Stack[String] //声明一个用来存储String变量的栈
stringStack.push("one") //将两个String元素放入栈中
stringStack.push("two")
println(stringStack.pop())
println(stringStack.pop())
}
}
object LearnGenericClass {
class Stack[A] { //声明一个泛型类,我们用这个泛型类,来实现一个简单的“栈”,栈是一种非常基础的数据结构,遵循先进后出,后进先出的准则。
private var elements: List[A] = Nil //声明一个泛型List,首先将其置为
def push(x: A) {elements = x :: elements} //"::"符号代表将变量添加到List首部中,这行代码含义是将x添加到elements这个List中
def peek: A = elements.head //获取elements的头部元素
def pop(): A = { //将头部元素弹出,也就是所谓的出栈
val currentTop = peek
elements = elements.tail
currentTop
}
}
def main(args: Array[String]) {
val intStack = new Stack[Int] //声明一个用来存储Int变量的栈
intStack.push(1) //将两个元素入栈
intStack.push(2)
println(intStack.pop()) //将两个元素出栈
println(intStack.pop())
val stringStack = new Stack[String] //声明一个用来存储String变量的栈
stringStack.push("one") //将两个String元素放入栈中
stringStack.push("two")
println(stringStack.pop())
println(stringStack.pop())
}
}
其中A就是类型,当然A你可以写成任意的标识符。
Scala的泛型函数
泛型:通俗的讲,比如需要定义一个函数,函数的参数可以接受任意类型。我们不可能一一列举所有的参数类型重载(overload)函数。
那么程序引入了一个称之为泛型的东西,这个类型可以代表任意的数据类型。
和泛型类一样,你需要把类型参数放在方法名之后。Scala会从调用该方法使用的时机参数来推断出类型。
object LearnGenericFunction {
def getData[T](list: List[T])={ //声明一个泛型函数,将一个List的类作为泛型函数的参数,使其能够处理内含各种数据类型的List
list(list.length / 2) //获取List中间位置的元素
}
def main(args: Array[String]) {
println(getData(List("a", "b", "c"))) //输出两个List的中间位置的元素
println(getData(List(1, 2, 3, 4, 5, 6)))
}
}