在不投射

时间:2016-11-10 10:44:41

标签: scala generics

我打算在"价值"可以由多个类扩展的属性。然后我需要能够比较彼此之间的特征的不同实例。首先,我想检查特征上定义的值 - 如果在两个实例中相同,那么我想触发特定于子的方法,该方法将相同类型的两个子实例相互比较。

我希望我能够清楚地解释清楚......

我编写了以下代码,但是ChildOne类没有编译 - 我得到的错误:

  

类ChildOne需要是抽象的,因为方法childCheck in trait   ParentType类型(其他:ChildOne.this.T)未定义布尔值   (注意ParentType.this.T与com.cards.ChildOne不匹配)

trait ParentType {
  val value: Int
  type T <: ParentType

  def parentCheck(other: T): Boolean = {
    if (this.value == other.value) childCheck(other)
    else this.value > other.value
  }

  def childCheck(other: T): Boolean
}

case class ChildOne(name: String) extends ParentType {
  val value = 1

  override def childCheck(other: ChildOne): Boolean = {
    true //some custom logic for each child...
  }

}

我可以将子方法的参数更改为ParentType,然后将其转换,但我想避免这种情况,我想知道有没有更好的方法来实现我想要实现的目标?

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:4)

您在ParentType中声明抽象类型 T,而不在ChildOne中覆盖它。您可以通过覆盖ChileOne中的T来轻松解决此问题:

case class ChildOne(name: String) extends ParentType {
  val value = 1
  override type T = ChildOne  // <----

  override def childCheck(other: ChildOne): Boolean = {
    true //some custom logic for each child...
  }
}