scala的泛型

100 阅读2分钟

泛型的概念

泛型的定义为:参数化类型,即所有操作的数据类型被指定为一个参数。 在Scala中,用[]表示(在java中使用<>

泛型方法

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

泛型方法的格式

  • 定义方法: def 方法名[泛型名称1,泛型名称2,. . .](参数列表 ) = {  }
  • 调用方法: 方法名[类型1,类型2,](参数列表)

示例代码如下:

def main(args: Array[String]): Unit = {
    val arr1 = Array(1,2,3,4,5)
    val arr2 = Array("a","b","c","d","e")
    def getMiddleEle[T](arr:Array[T]): T = {
      arr(arr.length/2)
    }
    val i:Int = getMiddleEle[Int](arr1)
    val j:String = getMiddleEle[String](arr2)
    println(i,j )
  }

理解泛型

理解泛型从如下几个方面:

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

case class Student()
val s1 = Student()
val list = ArrayList[Student]()
list += s1

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

2、泛型的声明方式是从外部把类型传入到类的内部,好比是传入参数一样。

泛型也称之为类型参数。如果参数没有传递,就说明不需要类型的约束,它也不会发生错误。而是采用通用类型。

3、在编译时有效,在运行时会失效。

也就是说在代码被编译之后,在产生的代码中是看不到泛型相关的代码的

泛型类

泛型类指的是:把泛型定义放在类的声明上。即:该类中的参数类型是由泛型来决定的。在创建对象的时候,再来明确具体的数据类型。

格式:

class [T](val 变量:T)

写泛型类的步骤格式:

先写一个普通的类 -> 把参数的类型(或者返回值的类型,或者内部属性成员的类型)改成泛型名 -> 在类名的后面添加[泛型]

示例代码

trait Logger[T]{
val a:T
def show(b:T)
}
object ConsoleLogger extends Logger[String]{
override val a:String = ""
override def show(b:String):Unit = println(b)
} 
main (){
println(ConsoleLogger.a)
}

泛型特质

泛型特质指的是:把泛型定义放在trait的声明上。即:该特质中的参数类型是由泛型来决定的。在定义特质的子类或者子单例对象时,明确具体的数据类型。

格式:

trait 特质A[T] {}
class B extends 特质A[指定的数据类型] {}

示例代码

trait Logger[T]{
val a:T
def show(b:T)
}
object ConsoleLogger extends Logger[String]{
override val a:String = ""
override def show(b:String):Unit = println(b)
} 
main (){
println(ConsoleLogger.a)
}