2012-07-30 2 views
6

で発生covariant type T occurs in invariant position in type => Array[T] of value gene共変タイプTは、私がScalaで私の最初のステップを移動していると私は、次のコードが動作したいと思い不変位置

私はのような何か行うことができます知っている:

trait Gene[+T] { 
    def gene[U >: T]: Array[U] 
} 

を私は値を必要とするので、これは問題を解決していません:pratically私が言うことをしようとしていることは、私はインの気にしない」であります私が知っているのは、遺伝子は、その内容を返す遺伝子フィールドを持つことを知っています」。 (ここで+ 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) 
    } 
} 

:ディディエ・デュポン社製の種類の提案で、私はこのコードに来ましたおいしさをチェック!

答えて

9

あなたが書き込むことができるので、配列は不変です。

あなたは

val typed = new Gene[String] 
val untyped : Gene[Any] = typed // covariance would allow that 
untyped.gene(0) = new Date(...) 

これは(あなたのインスタンス内の配列は配列[文字列]で、日付を受け付けません)クラッシュするんとします。コンパイラがそれを防止する理由は何か。

そこから、それはあなたがジーンでやろうとしていることに非常に依存します。 Array(おそらくVectorと考えるかもしれません)の代わりに共変型を使うことができますが、意図した通りであれば、コンテンツの変異を防ぐことができます。 private [this]が宣言されていれば、クラス内に配列を持つこともできます(これにより、コンテンツの変更も非常に困難になります)。クライアントが遺伝子の内容を突然変異させることができるようにするには、おそらくGene共変を作ることはできません。

+0

いいえ、私はそれを突然変異させる必要はありません。私は確かにVectorについて考えています。私の主な要件は、クライアントコードで異なるGene [T]の配列を管理することですが、依然として操作上の型制約があります。私はそれが難しいことを知っているし、私の最初のステップでまだ多分、私は単にあまりにも機能的すぎる、または動的すぎると思うかもしれないが、私はより大きなものを開発するつもりであり、これは必須であるかもしれません:自動ボクシングと値のunboxing。あなたが望むなら、私はその質問を言い換えることができます! –

+0

してください。あなたがしていることはうまくいかないが、必要なものが分からないので、もっと助けるのは難しい。パフォーマンスがあなたがArrayを望む理由ですか?Gene [T]の異種コレクションでは、クライアントは何を期待していますか? –

+0

私の答えを編集しました。私はあなたの助けを借りて私が解決策を見つけたと思うので、それを見直してください。明らかに私はあなたの答えを受け入れるつもりだ;) –

2

geneのタイプは、タイプパラメータで共変である必要があります。これを可能にするには、例えばリストなどの不変のデータ構造を選択する必要があります。しかし、scala.collection.immutableパッケージのデータ構造を使用することはできます。