我想为内部类实现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]
}有没有更好的方法来丰富内部类,这样就不需要进行造型了?
发布于 2013-06-07 16:50:31
这样如何:
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
}此外,我感觉您可以通过这种方式调用该方法,但它不会为了调用隐式类型而推断出单例类型参数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)https://stackoverflow.com/questions/16977730
复制相似问题