Я делаю первые шаги в Scala и хочу, чтобы следующий код работал:
trait Gene[+T] {
val gene: Array[T]
}
Ошибка, которую выдает компилятор::covariant type T occurs in invariant position in type => Array[T] of value gene
Я знаю, что мог бы сделать что-то вроде:
trait Gene[+T] {
def gene[U >: T]: Array[U]
}
но это не решает проблему, потому что мне нужно значение :практически, что я пытаюсь сказать: «Меня не волнует внутренний тип, я знаю, что гены будут иметь поле гена, которое возвращает его содержимое». (+T здесь, потому что я хочу сделать что-то вроде type Genome = Array[Gene[Any]]
, а затем использовать его как оболочку для отдельных классов генов, чтобы я мог иметь гетерогенный тип массива )Можно ли это сделать на Scala или я просто неправильно подхожу? Не лучше ли использовать другую структуру, например собственный ковариантный класс Scala?
Заранее спасибо!
P.S. :Я также пробовал с классом и абстрактным классом вместо типажа, но результат всегда один и тот же!
РЕДАКТИРОВАТЬ :с любезным предложением Дидье Дюпона. Я пришел к этому коду:
package object ga {
class Gene[+T](val gene: Vector[T]){
def apply(idx: Int) = gene(idx)
override def toString() = gene.toString
}
implicit def toGene[T](a: Vector[T]) = new Gene(a)
type Genome = Array[Gene[Any]]
}
package test
import ga._
object Test {
def main(args: Array[String]) {
val g = Vector(1, 3, 4)
val g2 = Vector("a", "b")
val genome1: Genome = Array(g, g2)
println("Genome")
for(gene <- genome1) println(gene.gene)
}
}
Итак, теперь я думаю, что могу размещать и извлекать данные в разных типах и использовать их со всеми вкусностями проверки типов!