编译器错误 - 协变返回类型与抽象覆盖

时间:2015-03-05 17:03:22

标签: scala

我有一个部分处理类型层次结构的程序。我试图在这里实现的就是拥有“旧类型”' def使用了我习惯于Java的协变返回类型功能。

trait NumericMember extends  NumericTypedef{ }

trait Type
trait NumericType extends Type

trait Typedef     { def oldType : Type }

class TypedefImpl  extends  Typedef { 
  //can't use a val since it will get overriden
  def oldType : Type = ???
}

trait NumericTypedef extends Typedef with NumericType { 
  abstract override def oldType : NumericType =    super.oldType.asInstanceOf[NumericType] 
}

class NumericTypedefImpl extends TypedefImpl with NumericTypedef{ }

class NumericMemberImpl  extends  NumericMember {
  private val autoType = new NumericTypedefImpl
  override def oldType: NumericType = autoType.oldType
} 

编译器盲目告诉我NumericMemberImpl中的oldType需要是一个抽象覆盖,然后当我遵守它时改变它的想法,弄清楚NumericMemberImpl实际上是一个类。

我可能在这里错误的途径,因为我意识到抽象覆盖被用于堆叠特征。当我想要的是必须具有oldType的一般和专用返回值。

帮助,有人吗?

1 个答案:

答案 0 :(得分:0)

我在这里跳过所有的classess事情,但想法是:

trait Type
trait NumericType extends Type 

trait Typedef { def oldType : Type }

class NumericMember extends Typedef {
    def oldType: NumericType = new NumericType{}
}

返回类型在scala和java中都是协变的。您不需要任何明确的类型转换。

关于这一个:

trait NumericTypedef extends Typedef with NumericType { 
  override def oldType : NumericType =    super.oldType.asInstanceOf[NumericType] 
}

没有什么可以覆盖,因为Typedef和NumericType都没有oldType的具体实现。使用实现的方法也没有super - 类(这是抽象覆盖推荐的原因)。抽象覆盖用于访问尚未实现的super方法(但将在具体类中)。你并不需要它,因为你不需要打电话给超级以获得正确的类型。

实现一些自定义类型提供程序:

abstract class NumericMember extends Typedef

trait  MyNumericTypeProvider extends Typedef { 
   def oldType = new NumericType{} 
}

trait  MyNumericTypeProvider2 extends Typedef { 
   def oldType = new NumericType{} 
}

scala> new NumericMember with MyNumericTypeProvider
res0: NumericMember with MyNumericTypeProvider = $anon$1@19a26a1

scala> new NumericMember with MyNumericTypeProvider2
res1: NumericMember with MyNumericTypeProvider2 = $anon$1@16bdcbe5

scala> res0.oldType
res2: NumericType = MyNumericTypeProvider$$anon$1@2be1fa9c

查看res2: NumericType - scala的类型推断会自动找到关于协方差的正确类型。