How about:
object Test extends App {
class Outer {
class Inner(val x: Option[Inner] = None) {
def test(y: Inner) { println(s"$toString testing $y") }
}
implicit class ExtInner(val inner: Inner) {
def get = inner.x.get
}
}
val outer = new Outer
val inner = new outer.Inner(Some(new outer.Inner))
import outer._
inner.test(inner.get)
}
or just enhance outer's Inners:
implicit class ExtInner(val inner: outer.Inner) {
def get = inner.x.get
}
Also, I sense that you can invoke the method this way, but it will not infer the singleton type param outer.type in order to summon the implicit.
implicit class ExtInner[A <: Outer with Singleton](val inner: A#Inner) {
def get: A#Inner = inner.x.get
}
inner.test(ExtInner[outer.type](inner).get)