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类型,可以通过隐式转换(类似于简单类型约束<%)