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類型,可以通過隱式轉換(類似於簡單類型約束<%)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章