scala类型参数泛型


泛型就是不确定的类型,可以在类或方法不确实传入类型时使用,可以提高代码的灵活性和复用性。

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)))
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码上行舟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值