Scala基础应用(8)- 约束

Scala基础应用(8)- 约束

1. 上下界 (<:, >:)

  • 上界:A <: B, B为A的上界,即A必须为B的子类(含本类)

    def test[A <: String, B] (str: A) (getStr: A => B) : B =
        getStr(str)
    
    val result = test("test1")( (x) => "my test string is " + x)
  • 下界: A >: B, 与上界相反,A必须为B的超类 (含本类)

2. 视界 (<%)

视界与上界很类似,只是加入了隐式转换的支持

  • 例子
def test [A <% B](param1: String, param2: Int ...): 返回类型 = ...

等价于
def test [A] (param1: String, param2: Int ...)(implicit viewAB: A => B) : 返回类型 = ...

也等价于
implicit def viewAB(a: A) : B = ...
def test [A] (param1: String, param2: Int ...): 返回类型 = ...

类的视界

class A[T <% Int]

trait不支持视界

3. 广义类型约束符号 =:=, <:<, <%<

进一步对类型参数化的class或trait进行约束
如下声明方式为类型参数化的class或trait

case class Foo[A](参数列表) //这里A即为Foo类的参数化类型
  • A =:= B, 表示证明A为该特定类型B, 不支持通过隐式转换成该特定类型, 即 A 必须是B类型
case class Foo[A](a:A) {
    def getLen(implicit str: A =:= String) = a.length
}

Foo("test string").getLen // 返回11
Foo(123).getLen // 报错

下面通过隐式转换也会报错
import scala.language.implicitConversions
implicit def int2String(n: Int) = n.toString
Foo(123).getLen //报错
  • A <:< B 表示 A 必须是B的子类型
  • A <%< B 表示 A 必须是可视化为B类型,可以通过隐式转换(类似于简单类型约束<%)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章