前言
day08,我们学习了scala的集合、模式匹配、样本类。今天学习scala的泛型、上界与下界、隐式转换。
泛型
和Java或者C++一样,类和特质可以带类型参数。在Scala中,使用方括号来定义类型参数。
/**
添加“[T]”就是使用泛型,这样就可以处理任意类型的数据了
*/
class GenericClass[T]{
//使用“_”代替初始值
private var g:T = _
def set(gg:T):Unit={
g = gg
}
def get():T = {
g
}
}
object Demon3{
def main(args: Array[String]): Unit = {
//处理Int
var gen = new GenericClass[Int]
gen.set(100)
println(gen.get())
//处理String
var genString = new GenericClass[String]
genString.set("Hello")
println(genString.get())
//处理Double
var genDouble = new GenericClass[Double]
genDouble.set(10.345)
println(genDouble.get())
}
}
上界与下界
类型的上界和下界,是用来定义类型变量的范围。它们的含义如下:
S <: T 这是类型upper bounds(上界)的定义。也就是S必须是类型T的子类或本身,自己也可以认为是自己的子类。这里的S表示某种类型,如Int、String。
U >: T 这是类型lower bounds(下界)的定义。也就是U必须是类型T的父类或本身,自己也可以认为是自己的父类。这里的U表示某种类型,如Int、String。
如下在scala的命令行中,定义一个函数,在泛型里规定它的上界是String,那么它的类型就只能是String类型或它的子类,如果传入其它类型的数据,则函数会报异常。
scala> def addToString[T<:String](x:T,y:T) = x + "**" + y
addToString: [T <: String](x: T, y: T)String
scala> addToString("SFSF","XYD")
res2: String = SFSF**XYD
#传Int类型的数据,报异常了。
scala> addToString(1,3)
<console>:14: error: inferred type arguments [Int] do not conform to method addToString's type parameter bounds [T <: String]
addToString(1,3)
^
<console>:14: error: type mismatch;
found : Int(1)
required: T
addToString(1,3)
^
<console>:14: error: type mismatch;
found : Int(3)
required: T
addToString(1,3)
^
scala>
隐式转换
隐式转换函数指的是以implicit关键字修饰的函数。
在平常开发中,你看到一个类可以调用一些毫不相关的函数,难以理解,就是因为它使用了隐式转换,这也是隐式转换难以理解的地方,因为它是底层自动调用的,我们根本就没察觉到。
scala> def addToString[T <% String](x:T,y:T) = x + " *** " + y
addToString: [T](x: T, y: T)(implicit evidence$1: T => String)String
#传入Int类型的数据,调用失败
scala> addToString(1,4)
<console>:13: error: No implicit view available from Int => String.
addToString(1,4)
^
#定义一个隐式函数,功能是把Int类型的数据转换成String类型
scala> implicit def abc(n:Int):String = n.toString
warning: there was one feature warning; re-run with -feature for details
abc: (n: Int)String
#再次调用前面的函数,并且传入的是Int类型的数据,调用成功
scala> addToString(1,4)
res1: String = 1 *** 4
scala>
#再次定义一个隐式转换函数,功能也是把Int类型的数据转换成String类型
scala> implicit def myToString(n:Int):String = n.toString
warning: there was one feature warning; re-run with -feature for details
myToString: (n: Int)String
#报错,因为存在两个隐式转换函数,功能都是把Int转换成String,系统不知道调用哪个
scala> addToString(1,2)
<console>:17: error: ambiguous implicit values:
both method abc of type (n: Int)String
and method myToString of type (n: Int)String
match expected type Int => String
addToString(1,2)
^
scala>