Scala抽象类型边界交叉引用

时间:2012-05-22 19:39:43

标签: scala type-bounds

我有两个抽象类,它们将保持对彼此的引用。如何/我可以键入绑定类型成员,因为派生的十六进制类的SideT成员中的HexT类型将始终是派生的十六进制类?所以对于派生类HexA,保证:HexA#SideT#HexT = HexA

同样地,所有派生的Side类的HexT成员中的SideT类型将是派生的Side Class:SideB#HexT#SideT = SideB

我使用Scala for Eclipse 2.1.0.M1和Eclipse 3.7.2所有类都在单独的文件中。以下编译好,但不能保证我想要的东西:

abstract class Hex { type SideT <: Side {type HexT <= Hex } }
abstract class Side { type HexT <: Hex {type SideT <= side } }
class HexC() extends Hex() { type SideT = SideC }
class SideC extends Side { type HexT = HexC }

但以下不会在派生的实现中编译:

abstract class Hex{type SideT <: Side {type HexT = this.type}}
abstract class Side{type HexT <: Hex {type SideT = this.type}}
class HexC() extends Hex(){
  type SideT = SideC //This won't compile
}
class SideC extends Side {
  type HexT = HexC //this won't compile
}

这是对的吗?这应该编译吗?

1 个答案:

答案 0 :(得分:1)

这个怎么样?

abstract class Hex {
  type SideT <: Side
}

abstract class Side {
  type HexT <: Hex
}

class HexC extends Hex {
  type SideT = SideC
}

class SideC extends Side {
  type HexT = HexC
}

val evidence1 = implicitly[SideC#HexT =:= HexC]
val evidence2 = implicitly[SideC#HexT#SideT =:= SideC]

或者使用域的封装特征:

trait abstractDomain {
  type SideT <: Side
  type HexT <: Hex

  abstract class Hex
  abstract class Side
}

object domain extends abstractDomain {
  type SideT = SideC
  type HexT = HexC

  class HexC extends Hex
  class SideC extends Side
}

或者使用类型参数:

abstract class Hex[HexT <: Hex[HexT, SideT], SideT <: Side[HexT, SideT]]
abstract class Side[HexT <: Hex[HexT, SideT], SideT <: Side[HexT, SideT]]

class HexC extends Hex[HexC, SideC]
class SideC extends Side[HexC, SideC]