Обогатить внутренний класс
Я хочу реализовать шаблон enrich-my-library для внутреннего класса, который будет работать для любого экземпляра внешнего класса. Что-то вроде этого:
class Outer {
class Inner(val x: Option[Inner] = None) {
def test(y: Inner) {}
}
}
implicit class ExtInner(inner: Outer#Inner) {
def get = inner.x.get
}
val outer = new Outer
val inner = new outer.Inner(Some(new outer.Inner))
inner.test(inner.get)
Этот код не будет компилироваться из-за несоответствия типов: get
возвращает объект типа Outer#Inner
но test
надеется outer.Inner
,
У меня есть два способа заставить это работать, но оба включают использование asInstanceOf
чего я хотел бы избежать. Первый - просто бросить результат get
в outer.Inner
:
inner.test(inner.get.asInstanceOf[outer.Inner])
Второй немного более общий и выполняет кастинг в ExtInner
:
implicit class ExtInner[T <: Outer#Inner](inner: T) {
def get = inner.x.get.asInstanceOf[T]
}
Есть ли лучший способ обогатить внутренний класс, чтобы не было необходимости выполнять кастинг?
1 ответ
Как насчет:
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)
}
или просто улучшите Inners:
implicit class ExtInner(val inner: outer.Inner) {
def get = inner.x.get
}
Кроме того, я чувствую, что вы можете вызывать метод таким способом, но он не будет выводить параметр типа singleton тип external.type для вызова неявного.
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)