2011-08-11 51 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,使用網站邊界工程 –

相關問題