2012-03-06 5 views
4

私はスカラ初心者であり、自分のアプリケーション用にDAOレイヤーを開発しようとしています。次のコードスニペットは、モデルオブジェクト構造とそれに関連するデータアクセスオブジェクトの概要を示しています。さらに別のスカラー型の不一致エラー

// Model object base class 
abstract class Model[M <: Model[M]] { 

    val dao: Dao[M] 
} 

// DAO for each model object, with find, delete, update 
abstract class Dao[M <: Model[M]] { 

    // meta data describing the model object 
    case class Column(val name:String, val get: M => _) 

    val columns : Map[String,Column] 
} 

ここでは、モデルとそれに関連付けられたDAOの両方の具体的な使用方法を示します。私はモデルオブジェクトを使用し、それが直接DAOを関連付けられていたときに

// example simple model object with it's DAO 
case class ItemModel (val name:String) extends Model[ItemModel] { 
    val dao = ItemDao 
} 

object ItemDao extends Dao[ItemModel] { 

    val columns = Map("name" -> Column("name", { v:ItemModel => v.name})) 
} 

は今、人生は良いです。

object Works { 

    // normal access pattern 
    def good1(value: ItemModel) = value.name 

    // even through the DAO 
    def good2(value: ItemModel) = value.dao.columns("name").get(value) 
} 

問題は一般的にオブジェクトにアクセスしようとしているときです。私は、コンパイラが不平を言うことなくModel値を渡すためのメソッドシグネチャを得ることができません。

// Trouble trying to manipulate base model objects 
object Trouble { 

    // type mismatch; found : value.type (with underlying type test.Model[_]) required: _$2 where type _$2 Test.scala 
    def bad1(value: Model[_]) = value.dao.columns("name").get(value) 

    // type mismatch; found : value.type (with underlying type test.Model[_ <: test.Model[_]]) required: _$3 where type _$3 <: test.Model[_] 
    def bad2(value: Model[_ <: Model[_]]) = value.dao.columns("name").get(value) 

    // type mismatch; found : value.type (with underlying type X forSome { type X <: models.Model[X] }) required: X where type X <: models.Model[X] 
    def bad3(value: X forSome {type X <: Model[X]}) = value.dao.columns("name").get(value) 
} 

何か助けや指針をいただければ幸いです。

答えて

4

すべての悪いルーチンでは、値はModelですが、getの値はColumnで、Mとなります。あなたが行うことができ :あなたがそれらを必要としないとき

def good[M <: Model[M]](value: M) = value.dao.columns("name").get(value) 

は、実存のタイプを避け、彼らは物事をより複雑にします。また、Column.getM => Anyでもかまいません。共分散では、どの機能が許可されているかに制限はありません。

+0

ありがとうございました。あなたは男! –