【发布时间】:2016-03-28 07:56:51
【问题描述】:
我正在使用抽象类型,但在让 Scala 编译器统一两种应该相同的类型时遇到问题。这些是我的定义:
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)
}
即问题出在这一行:
i1.chromosome(0) = 6
类型错误是:
Error:(75, 22) type mismatch;
found : Int(6)
required: abstractTypes.Test.i1.chromosome.Gene
i1.chromosome(0) = 6
编译器似乎无法将i1.chromosome.Gene 与Int 统一起来。
我有两个问题:
- 是否可以帮助编译器统一这两种类型?
- 现在让我假设我已经删除了有问题的行并且我已经为
Individuals 正确定义了toString。为什么我在运行Test时会得到java.lang.NullPointerException。该错误似乎与GeneClassTag有关,但我不确定。
回复代码到@som-snytt:
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"
}
【问题讨论】:
标签: scala abstract-type