scala的泛型(一)

20 阅读2分钟

(一)泛型的概念

泛型的定义为:参数化类型,即所有操作的数据类型被指定为一个参数。

val arr = ArrayBuffer[String]()  
arr.insert(0, "a")  
val arr1 = ArrayBuffer[Int]()  
arr1.insert(0, 1)

在Scala中,用[ ]表示(在java中使用<>)。

(二)泛型方法

泛型方法指的是:把泛型定义放在方法声明上。即:该方法的参数类型是由泛型来决定的。在调用方法时,明确具体的数据类型。

(三)泛型方法的格式

定义方法: def 方法名泛型名称1,泛型名称2,. . . = {  }

调用方法: 方法名类型1,类型2,

如果在参数列表中可以推断出对应的类型,则可以省略方括号[类型1,类型2]

object fx01 {

  def getMiddle_int(arr:Array[Int]):Int = {
    // 长度 / 2
    arr(arr.length / 2)
  }

  def getMiddle_String(arr:Array[String]):String = {
    // 长度 / 2
    arr(arr.length / 2)
  }

  def getMiddle_Double(arr:Array[Double]):Double = {
    // 长度 / 2
    arr(arr.length / 2)
  }


  def main(args: Array[String]): Unit = {
    var m = getMiddle_int(Array(1,2,3,4,5))

    println(s"数组的中间元素是:${m}")

    var m1 = getMiddle_String(Array("aa","bb","cc"))

    println(s"数组的中间元素是:${m1}")

    var m2 = getMiddle_Double(Array(1.1,2.2,3.3))

    println(s"数组的中间元素是:${m2}")
  }
}

结果:

数组的中间元素是:3
数组的中间元素是:bb
数组的中间元素是:2.2

(四)理解泛型

1、泛型和数据类型有什么区别?

case class Student()

val s1 = Student()

val list = ArrayList[Student]()

list += s1

ArrayList 是数据类型,Student是泛型。 他们不是一个层次的概念。 类型内部的数据使用泛型来约束。

2、泛型的声明方式是从外部把类型传入到类的内部,好比是传入参数一样。所以,泛型也称之为类型参数。如果参数没有传递,就说明不需要类型的约束,它也不会发生错误。而是采用通用类型。

/*
* 泛型,参数化类型。函数中的参数是什么类型?这个类型是可以动态设置的!
* */

def getMiddle[T](arr: Array[T]): T = {
  // 长度 / 2
  arr(arr.length / 2)
}


def main(args: Array[String]): Unit = {
  var m = getMiddle[Int](Array(1,2,3,4,5))
  println(s"数组的中间元素是:${m}")

  var m1 = getMiddle[String](Array("aa","bb","cc"))
  println(s"数组的中间元素是:${m1}")

  var m2 = getMiddle[Double](Array(1.1,2.2,3.3))
  println(s"数组的中间元素是:${m2}")

  var m3 = getMiddle[Boolean(Array(true,false,true))
  println(s"数组的中间元素是:${m3}")

}

结果:

数组的中间元素是:3
数组的中间元素是:bb
数组的中间元素是:2.2
数组的中间元素是:false

3、在编译时有效,在运行时会失效。也就是说在代码被编译之后,在产生的代码中是看不到泛型相关的代码的。

object fx02 {
/*
* 定义集合 (set,list,map,array)时,通过泛型来传递可以装入的数据类型
* */

  def main(args: Array[String]): Unit = {

    var li = scala.collection.mutable.ListBuffer[Int]()   // 有无[Int]会有区别


    li += 1
    li += 2

    li.foreach(println)
  }
}

结果:

1
2