scala的泛型
- 基本概念
- Scala 中的泛型允许我们编写可以处理多种不同类型数据的代码,就像在 Java 等其他语言中一样。泛型通过类型参数来实现,它使得我们能够创建通用的类、方法和特质(trait)。
- 例如,定义一个简单的泛型类
Box
,它可以用来存储任何类型的值: -
class Box[T](content: T) { def getContent(): T = content }
- 在这里,
T
是一个类型参数。我们可以用任何具体的类型来替换T
,比如Box[Int]
可以存储整数,Box[String]
可以存储字符串。
- 类型参数约束
- 有时候我们希望对类型参数进行一些限制。例如,我们可能希望类型参数是某个类的子类或者实现了某个特质。这可以通过
<:
(上界)或>:
(下界)符号来实现。 - 上界约束:假设我们有一个类层次结构,
Animal
是基类,Cat
和Dog
是Animal
的子类。我们定义一个函数,它只能处理Animal
及其子类的列表。
- 有时候我们希望对类型参数进行一些限制。例如,我们可能希望类型参数是某个类的子类或者实现了某个特质。这可以通过
- 在这个例子中,
AnimalSubtype
是一个类型参数,它的上界是Animal
。这意味着AnimalSubtype
可以是Animal
本身或者它的任何子类。 - 下界约束:相对较少使用,但在某些场景下很有用。例如,当我们想要处理一个函数,它接受一个类型参数,并且这个类型参数是某个类型的超类时。
class Animal
class Cat extends Animal
class Dog extends Animal
def printAnimalNames[AnimalSubtype <: Animal](animals: List[AnimalSubtype]) {
animals.foreach(animal => println(animal.getClass.getName))
}
val cats: List[Cat] = List(new Cat, new Cat)
printAnimalNames(cats)
- 这里
T
的下界是Cat
,所以T
可以是Cat
或者它的超类。
- 协变和逆变
- 协变(Covariance):如果
A
是B
的子类型,那么List[A]
也是List[B]
的子类型,这种性质称为协变。在 Scala 中,我们可以使用+
符号来标记协变的类型参数。
- 协变(Covariance):如果
- 逆变(Contravariance):与协变相反,如果
A
是B
的子类型,那么Function1[B, C]
是Function1[A, C]
的子类型。在 Scala 中,用-
符号标记逆变的类型参数。
- 泛型方法
- 除了泛型类,Scala 还支持泛型方法。泛型方法是一种独立于类的泛型定义方式。
- 这个
identity
方法可以接受任何类型的参数,并返回相同类型的结果。类型参数T
在方法定义时确定,根据传入的实际参数类型来推断。
- 存在类型(Existential Types)
- 存在类型用于表示存在某个满足特定条件的类型。
-
package test40 //泛型 //需求:你是一个程序员,老板让你写一个函数,用来获取列表中的中间元素 //List(1,2,3,4,5) ==> 中间元素下标 = 长度/2 ====> 3 //getMiddleEle //[T]就是泛型:类型参数化,把类型当作参数传入函数内部 object test { //定义函数的格式 //def 函数名字(参数1,参数2):返回值类型={ // } // def getMiddleEle1(list:List[Int]):Int=list(list.length/2) // // def getMiddleEle2(list: List[String]): String = list(list.length / 2) // // def getMiddleEle3(list: List[Double]): Double = list(list.length / 2) def getMiddleEle[T](list: List[T]):T = list(list.length/2) def main(args: Array[String]): Unit = { val rs1 = getMiddleEle[Int](List(1,2,3,4,5)) println(rs1)//3 val rs2 = getMiddleEle[String](List("1","2","C","4","5")) println(rs2) //c println(getMiddleEle[Double](List(1.2,2.0,2.9))) // println(rs2) //c // println(1) // println(2) // println(3) // println(getMiddleEle1(List(1,2,3,4,5)))//3 // // println(getMiddleEle2(List("1","2","C","4","5"))) // // println(getMiddleEle3(List(1.2,2.0,2.9)))//2.0 } }
原文地址:https://blog.csdn.net/2401_87129116/article/details/144405121
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!