当有多个实例可用时,Scala中的隐式解析

时间:2019-01-11 09:28:29

标签: scala implicit

我具有以下特征:

trait Close[T]{
  def close(t: T): Unit
}
object Close {
    final class CloseOps[T](t: T, c: Close[T]){
      def close(): Unit = c.close(t)
    }
    implicit def toCloseOps[T](t: T)(implicit c: Close[T]) = new CloseOps[T](t, c)
}

及其实例:

implicit val closeInputStream: Close[InputStream] = (t: InputStream) => t.close()
implicit def noOpClose[T]: Close[T] = _ => ()

我的误解是,如果我导入上面列出的两个implicit,我会使用更具体的一个。我的意思是方法

def someMethod[T](t: T)(implicit c: Close[T]){
    t.close()
}

及其用法

import Close._

val is: InputStream = new InputStream{
    override def read() = -1
    override def close() = throw new RuntimeException()
}

someMethod(is) //throws RuntimeException

因此,假设在这种情况下将使用closeInputStream实例而不是noOpClose[InputStream]实例是否可靠?还是提供某种后备隐式实例很常见?他们两个都匹配。

0 个答案:

没有答案