2016-11-08 61 views
1

我想了解这个错误:斯卡拉类型中的这个“_1”是什么?

found : row.type (with underlying type _#TableElementType) 
required: _1#TableElementType 

貌似我非常接近,但“1” _1#TableElementType这是什么?我可以将其中一个转换成另一个吗?

编辑:代码的有用位上下文(播放+油滑):

tableObject
abstract class GenericDAO[T <: AbstractTable[_]](...) { 
    def table: TableQuery[T] 
    def insert(model: T#TableElementType) = db run (table += model) 
} 

trait TableObject[T <: AbstractTable[_]] { 
    def rowFromJson(jsObject: JsObject): T#TableElementType 
    def dao(driver: JdbcProfile, db: Database): GenericDAO[T] 
} 

// Controller Action with an instance implementing `tableObject` above: 
val tableObject = tableObjectFactory("test") 
val row = tableObject.rowFromJson(request.body.asJson.get) 
val dao = tableObject.dao(driver, db) // tableObject has a DOA extending GenericDAO 
dao.insert(row) 

object TestTable extends TableObject[Test] { 
    def dao(driver: JdbcProfile, db: Database) = new TestDAO(driver, db) 
    def rowFromJson(j: JsObject): TestRow = { TestRow(...) } 
    class TestDAO(...) extends GenericDAO[Test](driver, db) { ... } 
} 

我使用一个工厂来从URL是正确的:

object TableObjectFactory { 
    def tableObjectFactory(name: String) = { 
    name match { 
     case "test" => TestTable 
     case "projects" => ProjectsTable 
     case "people" => PeopleTable 
     ... 
    } 
    } 
} 
+1

你能分享你的代码吗? – BDR

+0

我添加了提供上下文的代码。 – JulienD

+0

“tableObject”的类型究竟是什么?你是否将它定义为'val tableObject = TestTable'? –

回答

0

尽管它没有说明太多,我如果我让DAO解析请求体并插入,而不是单独生成行对象并在其上应用其中一个DAO方法,那么t起作用。

我得到了各种类似的错误,如_$1#TableElementType,_1$u#TableElementType等名称,但我认为它们是同一类的不同实例的编译器别名。

因此,解决办法是做

val j: JsValue = request.body.asJson.get 
val tableObject: TableObject[_] = tableObjectFactory(table) 
val dao = tableObject.dao(driver, db) 
val res: Future[Int] = dao.insert(j) 

其中新insert方法现在是GenericDAO抽象,并在具体的实现需要一个JsValue并解析它,然后插入:

class TestDAO(override val driver: JdbcProfile, override val db: Database) extends GenericDAO[Test](driver, db) { 
    import this.driver.api._ 

    val table = TableQuery[Test] 

    //def insert(model: TestRow) = db run (table += model) // NO! 

    def insert(j: JsValue): Future[Int] = { 
    val row = TestRow(
     (j \ "id").as[Int], 
     (j \ "name").as[String], 
     (j \ "value").as[Float], 
     (j \ "other").as[String] 
    ) 
    db run (table += row) 
    } 
} 

同时,它使得Play形式完全无用,无论如何这是一件好事。