阶:扩展内部类,不参考外类(Scala: Extending inner class, withou

2019-09-17 23:15发布

我可以在外类的内部或从外类派生的类内部延伸的内部类/性状。 我可以延长内部类的外部类中的特定实例的:

class Outer
{
  class Inner{}
}

class OtherCl(val outer1: Outer)
{
  class InnA extends outer1.Inner{}
}

注意:即使这似乎编译罚款产生非常有趣的可能性:

trait OuterA
{ trait InnerA } 

trait OuterB
{ trait InnerB }

class class2(val outerA1: OuterA, val outerB1: OuterB)
{ class Inner2 extends outerA1.InnerA with outerB1.InnerB }

但是,这不会编译:

class OtherCl extends Outer#Inner

至于我可以看到我想其中类型参数是外部类的一个实例,这样的东西的效果,扩展parametrised类

class OtherCl[T where T is instance of Outer] extends T.Inner

所以是不参考延伸的内部类/性状这是一个外性状/类内到外的性状/类的呢?

我不是找实例派生内部类没有外部类的一个实例,只声明其类型。

Answer 1:

您可以使用一个特质与自我型做类似的事情。 假设例如,我们有以下几点:

class Outer(val x: Int) {
  class Inner {
    def y = x
  }
}

我们要添加一些功能,以Inner ,而不具有Outer周围:

trait MyInner { this: Outer#Inner =>
  def myDoubledY = this.y * 2
}

现在,当我们实例化一个Inner我们可以在混合MyInner

scala> val o = new Outer(21)
o: Outer = Outer@72ee303f

scala> val i = new o.Inner with MyInner
i: o.Inner with MyInner = $anon$1@2c7e9758

scala> i.myDoubledY
res0: Int = 42

这不正是你想要的,但接近。



Answer 2:

不完全是你在找什么,但路径依赖型(2.10上或2.9与-Ydependent法类型标志,你可以做可供选择:

class Outer { class Inner {}; def create = new Inner }
def foo[T <: Outer](x: T) = x.create

希望这有助于



文章来源: Scala: Extending inner class, without reference to outer class