Как я могу передать объект в функцию в качестве аргумента в Scala? - PullRequest
1 голос
/ 12 августа 2011

Учитывая два объекта, которые расширяют класс:

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)

Возможно ли это?

1 Ответ

3 голосов
/ 12 августа 2011

Просто следуйте советам компилятора. Если вы хотите, чтобы SalatDAO[A, _] был подклассом SalatDAO[B, _], когда A <: B (то есть, когда A является подклассом B), объявите SalatDAO как ковариантный в своем первом параметр:

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

Если вы не можете изменить аннотацию отклонений, вы можете использовать границы сайта использования, такие как Java, как предложил Eastsun в комментариях:

def find[P <: Product, I](salatDAO: SalatDAO[P,I]) = // ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...