gpt4 book ai didi

scala - 需要澄清 Scala 方差和类型界限

转载 作者:行者123 更新时间:2023-12-02 13:00:41 26 4
gpt4 key购买 nike

我有一个 scala 特征定义如下:

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

我希望能够获得这个 DAO 的一个实例,它既适用于广告的子类,也适用于广告基类本身。我不知道如何达到预期的效果。

这是我尝试过的:

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

有人可以帮忙吗?

最佳答案

看起来您正在尝试将 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] 是 AdvertisingDAO[Advertisement] 的子类型] 因为AdvertisementImpl 是Advertisement 的子类型(因为AdvertisementImpl 扩展了Advertisement)。我发表了paper ,其中包含有关多种语言(例如 Scala、C#、Java)中出现的方差的教程。 Slides也可用于快速概览。希望这会有所帮助。

关于scala - 需要澄清 Scala 方差和类型界限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9569831/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com