scala类型系统:12) view bounds

很早前在来往的扎堆里发过一段模拟C#的using代码:

def using[ C <: { def close(): Unit }, T ] (resource: C) (handle: C => T): T = {
    try {
        handle(resource)
    } finally {
      closeQuietly(resource)
    }
}

Eric(药师)看到后,说 <% 更好

<%的意思是“view bounds”(视界),它比<:适用的范围更广,除了所有的子类型,还允许隐式转换过去的类型.它不出错的前提条件是A是B的子类型或者A能够隐式转换到B,否则method方法是存在问题的。

def method [A <% B](arglist): R = ...


def method [A](arglist)(implicit viewAB: A => B): R = ...

或等价于:

implicit def conver(a:A): B = …
在后面两种方式里,已经写明了存在A到B的隐式转换,因此这两种method自然不会出现问题。
def method [A](arglist): R = ...

<% 除了方法使用之外,class声明类型参数时也可使用:

scala> class A[T <% Int]
defined class A

但无法对trait的类型参数使用 <%

scala> trait A[T <% Int]
<console>:1: error: traits cannot have type parameters with context bounds `: ...' nor view bounds `<% ...'

补充,注意上面 using 方法中声明的结构类型 {def close():Unit},它的实现是通过反射做到的,所以有一定性能问题,在需要考虑性能的场景下,这里明确的用java.io.Closeable 接口更合适,灵活性与性能你总要做一个选择。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值