Scala基础应用(8)- 约束

来源:互联网 发布:js单选按钮选中 编辑:程序博客网 时间:2024/06/05 02:01

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 // 返回11Foo(123).getLen // 报错下面通过隐式转换也会报错import scala.language.implicitConversionsimplicit def int2String(n: Int) = n.toStringFoo(123).getLen //报错
  • A <:< B 表示 A 必须是B的子类型
  • A <%< B 表示 A 必须是可视化为B类型,可以通过隐式转换(类似于简单类型约束<%)
0 0
原创粉丝点击