2016-11-15 14 views
1
import org.apache.spark.graphx._ 

object Test { 
def main(args: Array[String]): Unit = { 
    val graph = GraphGenerator.generate_graph() 
    println(graph.numEdges) 
    println(solve(graph)) 
} 

def solve[A,B](graph: Graph[A,B]) = { 
    graph.numEdges 
} 
} 

graph.numEdgesがmain関数で正しく機能し、解決しないのはなぜですか?Scalaの汎用メソッドGraphX

コンパイラ出力:numEdgesはGraph [A、B]のメンバーではありません。

graph.numEdgesをgraph.edges.count()に変更すると動作します。

答えて

1

Graph[A,B]val numEdgesがなく、実際のクラスがより後になると起こります。

編集:val numEdgesGraphOpsから来ている:

Graphは暗黙的に取得

class GraphOps[VD: ClassTag, ED: ClassTag](graph: Graph[VD, ED]) extends Serializable { /** The number of edges in the graph. */ @transient lazy val numEdges: Long = graph.edges.count()

abstract class Graph[VD: ClassTag, ED: ClassTag] protected() extends Serializable { ... implicit def graphToGraphOps[VD: ClassTag, ED: ClassTag] (g: Graph[VD, ED]): GraphOps[VD, ED] = g.ops

しかし、(私たちの場合はA、Bで)VDおよびEDである場合にのみ、 scala.reflect.ClassTag s - あなたのsolve関数はそれを必要としないので、暗黙の変換は行われません。

2

の方法では、タイプ消去に対処するためにClassTagが必要です。関数を次のように定義できます。

import scala.reflect.ClassTag 

def solve[A: ClassTag, B: ClassTag](graph: Graph[A, B]) = graph.numEdges 
関連する問題