Scala隐式转换函数的应用与总结

《Scala隐式类型约束的应用与总结》中,我们讲解了隐式对象约束的方法,但在实践中,虽然其定义了统一的特质,便于实现与约束,但稍显复杂,这里还有一种替代方案——隐式转换函数,其接口声明如下:

def fn[A <% B](x: A) = x

它表示参数x的类型是A,但在调用此函数时必须存在隐式转换函数“A=>B”。

我们以求字符串的数字和作为例,首先定义方法接口,如下:

// 表明sum方法接受泛型参数,但必须存在A => Int的隐式函数
def sum[A <% Int](x: A, y: A) = x + y;

然后实现隐式转换函数,如下:

implicit def function(y: String) = Integer.parseInt(y);

最后测试,方法调用可直接使用字符串,如下:

val d = sum("12", "12");
//  输出24
println(d)

当然,这种写法还可以转换更容易理解的高阶函数形式,如下:

def sum[A](x: A, y :A)(implicit  fn: A => Int) = fn(x) + fn(y)

泛型约束总结

1. “[:]”定义了隐形约束对象

//  因为是泛型,x,y基本上没有操作
def add[A: ToInt](x: A, y: A) = (x, y)
// 必须定义ToInt隐式变量
//  但有什么用呢?
implicit val toInt: ToInt[String] = new ToInt[String] {
  override def toInt(arg: String): Int = Integer.parseInt(arg)
}

强烈推荐高阶函数写法,如下:

def toInt[A](x: A)(implicit y: ToInt[A]) = y.toInt(x)

2. “<%”定义了隐式转换函数

def sum[A <% Int](x: A, y: A) = x + y;

3. “<:”定义了泛型上下界,类似于JAVA中的“extends”

//  可以直接访问泛型对象中的方法
def plus[A, B <: ToInt[A]](x: A, y: A)(implicit t: B)= t.toInt(x) + t.toInt(y);
implicit val toInt: ToInt[String] = new ToInt[String] {
  override def toInt(arg: String): Int = Integer.parseInt(arg)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值