Переопределение типов для параметризованного метода в scala - PullRequest
2 голосов
/ 28 ноября 2011

Я пытаюсь переопределить мой параметризованный метод в scala,

У меня есть абстрактный класс, подобный этому:

abstract class Ranking[G <: AbstractGenome, MG <: MultiGoalLike] {
  def operate(individuals :IndexedSeq [IndividualMG[G,MG]]):IndexedSeq [IndividualMG[G,MG]
}

Я хочу два типа ранжирования, для которых требуется оформленная версия IndividualMG: IndividualMG[G,MG] with IDistance и IndividualMG[G,MG] with IRank.

Моя IndividualMG подпись класса:

class IndividualMG[G <: AbstractGenome,MG <: MultiGoalLike] (val genome: G,val multiGoal:MG) 

Мои два класса для ранжирования:

class Ranking1 [G <: AbstractGenome, MG <: MultiGoalLike] extends Ranking[G,MG] {
override def operate(individuals :IndexedSeq [IndividualMG [G,MG] with IRanking])
:IndexedSeq [IndividualMG [G,MG] with IRanking]= {
return ...
}

class Ranking2 [G <: AbstractGenome, MG <: MultiGoalLike] extends Ranking[G,MG] {
override def operate(individuals :IndexedSeq [IndividualMG [G,MG] with IDistance])
:IndexedSeq [IndividualMG [G,MG] with IDistance] = {
return ...
}

У меня естьошибка, это логика, потому что тип отличается, когда я пытаюсь переопределить, но как я могу сделать, чтобы проверить тип наследования [I <: IndividualMG [G,MG]] для моих двух операторов ранжирования в классе Ranking1 и Ranking2?

Спасибо стек, SR.

Ответы [ 2 ]

2 голосов
/ 28 ноября 2011

Я думаю, что вы ищете тип, зависящий от пути .

abstract class AbstractGenome
class ConcreteGenome extends AbstractGenome
class MultiGoalLike
trait IRanking

abstract class Ranking[G <: AbstractGenome, MG <: MultiGoalLike] {
  type RankType <: IndividualMG[G,MG]
  def operate(individuals :IndexedSeq [RankType])
}

class IndividualMG[G <: AbstractGenome,MG <: MultiGoalLike] (val genome: G,
                                                          val multiGoal:MG)

class Ranking1 [G <: AbstractGenome, MG <: MultiGoalLike] extends Ranking[G,MG] {
  type RankType = IndividualMG [G,MG] with IRanking
  override def operate(individuals :IndexedSeq [RankType])= println("it worked!")
}

val cg = new ConcreteGenome
val mgl = new MultiGoalLike

val r1 = new Ranking1[ConcreteGenome, MultiGoalLike]

val i1 = new IndividualMG(cg, mgl)
val i2 = new IndividualMG(cg, mgl) with IRanking

r1.operate(Vector(i1)) // error
r1.operate(Vector(i2)) // OK
2 голосов
/ 28 ноября 2011

А как же

abstract class Ranking[
    -I <: IndividualMG[G, MG], 
    G <: AbstractGenome, 
    MG <: MultiGoalLike] {
  def operate(individuals :IndexedSeq[I])
}

class Ranking1[
   G <: AbstractGenome, 
   MG <: MultiGoalLike] 
  extends Ranking[IndividualMG[G,MG] with IDistance, G, MG] ...
...