У меня есть следующая черта:
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]
? Или это обычное предоставление неявного неявного экземпляра? Оба они совпадают.