我有一个部分处理类型层次结构的程序。我试图在这里实现的就是拥有“旧类型”' 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的一般和专用返回值。
帮助,有人吗?
答案 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的类型推断会自动找到关于协方差的正确类型。