Неявное разрешение в Scala, когда доступно более 1 экземпляра - PullRequest
0 голосов
/ 11 января 2019

У меня есть следующая черта:

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

...