看起来您正在尝试将特征 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)中出现的方差的教程。 幻灯片也可用于快速概览。希望这可以帮助。