2016-11-08 4 views
1

私はこのエラーを理解したいと思います:Scalaこの "_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のメソッドの1つを適用する必要はありません。

私は_$1#TableElementType,_1$u#TableElementTypeなどのような名前のすべての種類の似たようなエラーがありますが、私は彼らが同じクラスの異なるインスタンスのコンパイラエイリアスだと思います。

だから、解決策は

この新しい insert方法は今 GenericDAO抽象で、具体的な実装で JsValueを受け取り、それを解析し、その後、挿入
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) 

行うことでした。

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フォームは完全に役に立たなくなりますが、とにかく良いことです。

関連する問題