我具有以下特征:
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]
实例是否可靠?还是提供某种后备隐式实例很常见?他们两个都匹配。