我想为内部类实现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)
由于类型不匹配,此代码将无法编译:{{1}}返回get
类型的对象,但Outer#Inner
需要test
。
我有两种方法可以使它工作,但都涉及使用我想避免的outer.Inner
。第一个是将asInstanceOf
的结果转换为get
:
outer.Inner
第二个更通用,并在inner.test(inner.get.asInstanceOf[outer.Inner])
中进行投射:
ExtInner
有没有更好的方法来丰富内部类,所以不需要进行投射?
答案 0 :(得分: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)
}
或只是增强外在的内在:
implicit class ExtInner(val inner: outer.Inner) {
def get = inner.x.get
}
另外,我觉得你可以用这种方式调用方法,但它不会推断单例类型param outer.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)