4

I have a scala trait defined as follows:

trait AdvertisementDAO[A <: Advertisement] extends CrudRepository[A, Integer] {
...

I would like to be able to get an instance of this DAO that would work for both subclasses of Advertisement or the base Advertisement class itself. I am not sure how to achieve the desired effect.

Here is what I tried:

@Inject
var advertisementDAO: AdvertisementDAO[+Advertisement] = _

Can anyone help?

4

2 回答 2

3

看起来您正在尝试将特征 AdvertisementDAO 的类型参数 A 定义为协变。下面是上一个答案中使用协方差注释 + 的代码示例的变体。

trait Advertisement {}

class AdvertisementImpl extends Advertisement{}

class CrudRepository[+A,B]  {}

trait AdvertisementDAO[+A <: Advertisement] extends CrudRepository[A, Integer] {}

class AdvertisementDAOImpl[+A <: Advertisement] extends AdvertisementDAO[A]{}

class AdvertisementDAOImpl2 extends AdvertisementDAO[AdvertisementImpl]{}

class AdvertisementDAOImpl3 extends AdvertisementDAO[Advertisement]{}

object Tester
{
  def main(args:Array[String]):Unit =
  {
    var advertisementDAO: AdvertisementDAO[Advertisement] = null
    advertisementDAO = new AdvertisementDAOImpl
    advertisementDAO = new AdvertisementDAOImpl2 
    advertisementDAO = new AdvertisementDAOImpl3
  }
}

协变泛型的另一个例子是 scala.collection.immutable.List。将泛型(类或特征)C 定义为协变意味着 C[S] 是 C[T] 的子类型,如果类型 S 是类型 T 的子类型。例如,AdvertisementDAO[AdvertisementImpl] 是 AdvertisementDAO[Advertisement ] 因为 AdvertisementImpl 是 Advertisement 的子类型(因为 AdvertisementImpl 扩展了 Advertisement)。我发表了一篇论文,其中包含有关在许多语言(例如 Scala、C#、Java)中出现的方差的教程。 幻灯片也可用于快速概览。希望这可以帮助。

于 2012-04-12T16:58:17.343 回答
2

我尝试了很多组合,但我收到了一个用 scala 2.9.1 编译的组合

  var advertisementDAO: AdvertisementDAO[_ <:Advertisement] = _

  advertisementDAO = new AdvertisementDAOImpl

  advertisementDAO = new AdvertisementDAOImpl2 

  advertisementDAO = new AdvertisementDAOImpl3

我的代码:

trait Advertisement {}

class AdvertisementImpl extends Advertisement{}

class CrudRepository[A,B]  {}

trait AdvertisementDAO[ A <: Advertisement] extends CrudRepository[A, Integer] {}

class AdvertisementDAOImpl[A <: Advertisement] extends AdvertisementDAO[A]{}

class AdvertisementDAOImpl2 extends AdvertisementDAO[AdvertisementImpl]{}

class AdvertisementDAOImpl3 extends AdvertisementDAO[Advertisement]{}
于 2012-03-05T20:55:38.393 回答