2015-11-05 123 views
0

我試圖創建一個基於類型的數據加載類型的類 -無法找到斯卡拉類型類的隱含參數

以下是類型:

trait DataSource 
case class HDFSSource(path: String) extends DataSource 
case class HiveTableSource(db: String, tbl: String) extends DataSource 

這裏是特質

trait Loader[A, B, C] { 
    //Any Spark loader requires 
    // A -> Input Type 
    // B -> Output Type 
    // C -> some type of implicit context provided by the compiler from the sourounding environemnt.. 
    def load(input: A)(implicit context: C): B 

這裏是實現:

object Loader { 
    implicit object HiveLoader extends Loader[HiveTableSource, DataFrame, HiveContext] { 
    def load(source: HiveTableSource)(implicit hc: HiveContext): DataFrame = { 
     val db = source.db 
     val tbl = source.tbl 
     val df = hc.sql(s"select * from $db.$tbl") 
     df 
    } 
    } 
    def loadDataSource[A: Loader, B, C](d: A) = implicitly[Loader[A,B,C]].load(d) 

編譯器抱怨說它無法找到隱含的參數證據,具體在「隱式地[ABC]」中:

目標是讓每個類型具有不同行爲的類型類別,並且還使用不同的上下文由環境隱含提供)

回答

4
def loadDataSource[A, B, C](d: A)(implicit ldr: Loader[A,B,C], context: C): B = ldr.load(d) 

我沒有嘗試編譯它自己,但我相當肯定,這將工作。

loadDataSource[A: Loader, B, C](d: A) is desugared to loadDataSource[A, B, C](d: A)(implicit ev: Loader[A]),由於Loader需要3個類型參數,因此在此不起作用。所以你必須顯式地註解隱式參數,而不是使用上下文綁定。

爲了調用Loader的load方法,必須提供一個隱式C.這就是爲什麼我添加了額外的context: C隱式參數。

+0

進口Loader._ loadDataSource(c.src) 結果「找不到paramater LDR內含價值的任何想法 – user2726995

+0

你必須鍵入註釋loadDataSource 所以'進口Loader._。?; loadDataSource [HiveTableSource,DataFrame,HiveContext](c.src)'我會相信。 –