Scala中的继承类型别名在构造函数声明中是不可见的,但在构造函数体中是可见的

时间:2014-03-14 14:27:16

标签: scala type-alias

为什么Scala表现得像这样?

更重要的是,如何修复此代码

我问的是这个问题,因为我需要在几个子类的构造函数声明中使用复杂的类型,我希望保持 DRY

class Parent{
  type IntAlias=Int
}

class Child (val i1:IntAlias=3) extends Parent{ //Compilation error, why ?
  val i2:IntAlias= 1  //No problem here!
}

编译错误:

 not found: type IntAlias
class Child (val i1:IntAlias=3) extends Parent{
                    ^

1 个答案:

答案 0 :(得分:6)

在您的定义中,IntAlias是班级Parent的成员。因此,如果没有Parent实例,则无法访问该成员。您可以将您的第二个案例读作val i2: this.IntAlias = 1。您可以在此处访问实例this

对于值而不是类型,这类似于以下内容:

class Parent {
  def intValue: Int = 1234
}

class Child(val x: Int = intValue) extends Parent  // does not compile

因此,您必须将该成员放在不同的范围内,例如伴随对象:

 object Parent {
   type IntAlias = Int
 }
 import Parent.IntAlias

 class Child(val i1: IntAlias = 3) extends Parent {
   val i2: IntAlias = 1
 }