4

私は次のように定義されたscalaトレイトを持っています:

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

Advertisementのサブクラスまたは基本のAdvertisementクラス自体の両方で機能するこのDAOのインスタンスを取得できるようにしたいと思います。どうすれば目的の効果が得られるのかわかりません。

これが私が試したことです:

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

誰か助けてもらえますか?

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 を共変として定義することは、型 S が型 T のサブタイプである場合、C[S] が C[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 に答える