抽象型を使用しており、Scalaコンパイラが同じでなければならない2つの型を統一することに問題があります。これらは私の定義は以下のとおりです。抽象型との型の不一致
i1.chromosome(0) = 6
と型エラーは次のとおりです:
trait Chromosome {
type Gene
val size : Int
def apply(idx : Int) : Gene
def update(idx : Int, g : Gene)
def indices = Range(0, size-1)
}
trait Individual {
type Fitness
implicit protected val ord: Ordered[Fitness] = implicitly[Ordered[Fitness]]
val chromosome : Chromosome
def size : Int = chromosome.size
def apply(idx : Int) : chromosome.Gene = chromosome.apply(idx)
def update(idx : Int, g : chromosome.Gene) = chromosome.update(idx, g)
protected var _fitness : Fitness = _
def fitness : Fitness = _fitness
def fitness_=(f : Fitness):Unit = _fitness = f
}
case class ArrayChromosome(size : Int) extends Chromosome {
implicit protected val tag : ClassTag[Gene] = implicitly[ClassTag[Gene]]
protected val xs : Array[Gene] = new Array[Gene](size)
def apply(idx : Int) = xs(idx)
def update(idx : Int, g : Gene) = xs(idx) = g
}
abstract class ArrayIndividual(size : Int) extends Individual {
val chromosome = ArrayChromosome(size)
}
class MyIndividual(size : Int) extends ArrayIndividual(size) {
type Gene = Int
type Fitness = Double
}
object Test extends App {
val i1 = new MyIndividual(10)
i1.fitness = 10.5
i1.chromosome(0) = 6
print(i1)
}
はつまり、問題は、このラインである
Error:(75, 22) type mismatch;
found : Int(6)
required: abstractTypes.Test.i1.chromosome.Gene
i1.chromosome(0) = 6
コンパイラが統一することができないようですi1.chromosome.Gene
とInt
。
私は2つの質問があります。
- は、それはコンパイラが両方のタイプを統一する手助けすることは可能ですか?
- 問題のある行を削除し、
toString
をIndividual
に正しく設定したとします。Test
を実行すると、なぜjava.lang.NullPointerException
になるのですか?このエラーはGene
ClassTag
に関連しているようですが、わかりません。
@のSOM-snyttに対する応答のコード:Scalaで
abstract class ArrayIndividual(size : Int) extends Individual {
type Gene
implicit protected def tag2: ClassTag[Gene]
val chromosome = new ArrayChromosome(size) {
type Gene = ArrayIndividual#Gene
protected val tag : ClassTag[Gene] = tag2
}
}
class MyIndividual(size : Int) extends ArrayIndividual(size) {
type Fitness = Double
type Gene = Int
implicit protected val tag2 : ClassTag[Gene] = implicitly[ClassTag[Gene]]
override def toString = s"${super.toString} $chromosome"
}
おかげで、しかし、クラスArrayChromosomeで抽象的であるべきで、これだけを拡張するサブクラスで、後に定義され得る遺伝子を入力します。
Individual
サブクラスは、具体的なChromosome
を指定させる例えば、。私は型パラメータを追加することができると思いますが、そのようなパラメータなしで統一問題を解決することは可能ですか? – pepeStck
それは私がタグについてのコメントによって意味したものです。コード例を追加します。 –
レイジーヴァルに注意してください。 –