day09-scala的泛型、上界与下界、隐式转换

前言

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值