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

Scala中抽象类扩展的访问类型成员,scala,oop,abstract-class,parameterized-types,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 =

我在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)
}
我想定义一个由代理扩展的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))

}
但是我想访问与扩展代理的类型相关联的geneTag。 我想知道如何做一些类似于囚犯基因标签的事情


有什么想法吗

您与
E.geneType
关系密切。这里需要一个类型投影,由
E#geneType
编写


请参阅关于一般类型投影的另一个SO问题:

I get error:E#geneType没有可用的类标记。我尝试了E#geneType:ClassTag,也尝试了另一篇SO帖子建议的不同操作。对,你还需要一个
ClassTag
来自
Simulation
。但你不能凭空变出一个。您需要将其作为类中的附加参数:
abstract class Simulation[E这是可行的,但是由于数组不变性,切片函数出现了问题。我将对此进行更深入的研究。
val pris = new Prisoner(genome, memSize)
pris.geneTag