2011-08-11 49 views
1

鉴于其扩展一个类的两个对象:如何在函数中将对象作为Scala中的参数传递?

object PageDAO 
    extends SalatDAO[Page, Long](collection=Config.getMongoDB("db_development")("pages")) 

object BookDAO 
    extends SalatDAO[Book, Long](collection=Config.getMongoDB("db_development")("books")) 

我想写它具有对象作为参数的函数:

def find[ID](salatDAO:SalatDAO[Product,ID]) = salatDAO.find(MongoDBObject()).limit(10) 

scala> find[Long](PageDAO) 
<console>:27: error: type mismatch; 
found : PageDAO.type (with underlying type object PageDAO) 
required: com.novus.salat.dao.SalatDAO[Product,Long] 
Note: Page <: Product (and PageDAO.type <: com.novus.salat.dao.SalatDAO[Page,Long]), but class SalatDAO is invariant in type ObjectType. 
You may wish to define ObjectType as +ObjectType instead. (SLS 4.5) 
     find[Long](PageDAO) 

这可能吗?

+0

您是否尝试过的编译器的顶端? – sschaef

+0

我不明白编译器提示的实际含义。我在哪里附加+ ObjectType?作为SalatDAO定义的一部分? –

回答

3

只需按照编译器的建议。如果你想SalatDAO[A, _]是的SalatDAO[B, _]一个子类时A <: B(即当AB一个子类),声明SalatDAO在其第一个参数:

trait SalatDAO[+A, B] // ... 
      ^  <-- that plus does the trick 

如果你不能改变的变异注释,你可以使用使用现场界,点菜的Java,如东日提出的意见:

def find[P <: Product, I](salatDAO: SalatDAO[P,I]) = // ... 
+0

如果我不能改变SalatDAO特性怎么办?它是一个librayr,不是我的代码库的一部分。 https://github.com/novus/salat/blob/master/salat-core/src/main/scala/com/novus/salat/dao/SalatDAO.scala –

+3

这是否工作?:def find [ID,PRO < :产品](salatDAO:SalatDAO [PRO,ID])= ... – Eastsun

+0

感谢Eastsun,使用网站边界工程 –

相关问题