2016-12-07 21 views
0

のグラフクラスの推論された型の引数のエラー私はScalaで以下のグラフクラスを実装しよう: ケースクラスNodeTScalaの

case class Node[T](i:T) 

class Graph[N<:Node[T], +T](someNodes:Set[N], val edges:Set[(N,N)]) { 
    val nodes: Set[N] = someNodes ++ edges.map(_._1) ++ edges.map(_._2) 

    def addVortex(node:N)=new Graph(someNodes, edges)//just use someNodes instead of nodes + node 
} 

しかし

推測された型引数をというエラーがあります[ N、何も] [N <:ノード[T]クラスグラフの 型パラメータの境界に準拠していない、+ T]

なぜこれが起こるのですか?

答えて

2

私はちょうどあなたのコードに2つの問題があり、@のchengpohiの答え

を明確にします。

小型問題:タイプTGraphコンストラクタで言及されていないので、あなたはそれを指定する必要があり、直接好き:

def addVertex(node: N) = new Graph[N, T](someNodes + node, edges) 

もっと大きな問題:@chengpohiはTがでGraphと不変でcovaiantすることができなかったタイプを述べたようにNodeと同時に。 Graph[Node[String], String]Graph[Node[String], AnyRef]のサブタイプであるが、これは矛盾を作成すること、例えば、共変手段としての型パラメータTに言及:だから、理由があるの定義の1

case class Node[+T](i: T) 

または

class Graph[N <: Node[T], T] 

を修正する必要があります、Node[String]まではNode[AnyRef]のサブタイプではありませんが、あなたの定義に従ってください。

1

あなたはGraph[N<:Node[T], +T]variantタイプTを有効にする場合は、NodeTvariantも有効にする必要があります。

case class Node[+T](i:T) 
+1

こんにちは、私はスカラを初めて知りました.Tと+ Tの違いは何ですか?ありがとう – sweetyBaby

+0

私は試しましたが、それでも同じエラーが表示されます – sweetyBaby

+1

@sweetyBaby:http://docs.scala-lang.org/tutorials/tour/variances.html – curious