簡體   English   中英

Scala中抽象類擴展的訪問類型成員

[英]Access type member of an extension of an abstract class in Scala

我在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.geneTagE.geneType之類的東西,但這些都不起作用。 如果我有一個Prisoner類型的對象 ,則可以使用以下命令訪問其geneType ,Boolean

val pris = new Prisoner(genome, memSize)
pris.geneTag

但是我想訪問與擴展Agent類型相關聯的geneTag 我想弄清楚如何做類似Prisoner.geneTag的操作

有任何想法嗎?

您已經接近E.geneType 您需要在此處進行類型投影 ,編寫為E#geneType

總體來看其他有關類型投影的SO問題: Scala中的#運算符是什么意思?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM