首页 > 解决方案 > 当超过 1 个实例可用时,Scala 中的隐式解析

问题描述

我有以下特点:

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下将使用 instance 的实例而不是 ,这是否可靠noOpClose[InputStream]?或者提供某种后备隐式实例是否常见?他们两个是匹配的。

标签: scalaimplicit

解决方案


推荐阅读