访问Scala中抽象类扩展的类型成员

时间:2014-07-12 01:49:03

标签: scala oop abstract-class parameterized-types

我在scala中有一个抽象类:

abstract class Agent {
  type geneType
  val genome: Array[geneType]
  implicit def geneTag: reflect.ClassTag[geneType]
  def copy(newGenome: Array[geneType]): AgentT[geneType]
}
object Agent { type AgentT[A] = Agent { type geneType = A }}

我还得到了该课程的延伸:

case class Prisoner(initGenome: Array[Boolean]) extends Agent {
  type geneType = Boolean
  val genome = initGenome
  def geneTag = implicitly[reflect.ClassTag[Boolean]]
  def copy(newGenome: Array[geneType], memSize:Int):AgentT[Boolean] = new Prisoner(newGenome:Array[Boolean], memSize: Int)
}

我想定义一个由Agent扩展的geneType参数化的函数。不过,我不确定如何访问该类的类型成员。说它具有以下功能:

def slice[A](parentA: AgentT[A], parentB: AgentT[A]): (AgentT[A], AgentT[A]) = {
  val genomeSize = parentA.genome.length
  require (parentB.genome.length == genomeSize)
  import parentA.geneTag

  val index    = (math.random * genomeSize + 0.5).toInt
  val (aInit, aTail) = parentA.genome.splitAt(index)
  val (bInit, bTail) = parentB.genome.splitAt(index)
  val genomeA  = Array.concat(aInit, bTail)
  val genomeB  = Array.concat(bInit, aTail)
  (parentA.copy(genomeA), parentB.copy(genomeB))
}

此外,假设正在从其他一些过程中调用此函数,如下所示:

abstract class Simulation[E <: Agent](population: Array[E]) {

  var pop = population
  // HERE's WHERE I'm CONFUSED
  val (child1, child2) = slice[ ????????? ](pop(1), pop(2))

}

我正在尝试像 E.geneTag E.geneType 这样的东西,而那些没有用。如果我有一个对象 囚犯,我可以使用

访问其 geneType ,布尔值
val pris = new Prisoner(genome, memSize)
pris.geneTag

但我想访问与扩展代理商类型相关联的 geneTag 。 我想知道如何做像 Prisoner.geneTag 这样的事情。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

你与E.geneType关系密切。你需要一个类型的投影,写成E#geneType

另见关于类型预测的其他问题:What does the `#` operator mean in Scala?