gpt4 book ai didi

scala - scala 中的逆变

转载 作者:行者123 更新时间:2023-12-04 17:56:35 24 4
gpt4 key购买 nike

我是 scala 的新手。我试图弄清楚整个逆变关系是如何工作的。我理解协变和不变的概念,我也知道我将如何在实践中实现它们。我还了解逆变(协方差的逆)的概念以及它是如何在 Scala 的 Function1 特征中实现的。它为您提供了一个抽象,而无需为不同的类重新定义 Function1 实现。但是,我还是没有完全理解,奇怪吗?现在,我快到了……我怎样才能用逆变解决以下问题:

class GarbageCan[-A] {

def doSomething(a: A): Unit ={
// do something with 'a' of subtype that is not possible with the supertype
}

}

def setGarbageCanForPlastic(gc: GarbageCan[PlasticItem]): Unit = {

}

以上例子摘自http://blog.kamkor.me/Covariance-And-Contravariance-In-Scala/ .关于这个主题的一个很好的解释。层次结构如下:Item(基类)-> PlasticItem(子类)-> PlasticBottle(子类的子类)

setGarbageCanForPlastic 函数接受类型为 PlasticItem 的 GarbageCan。因为Parameterized类型是逆变的,下面的语句是完全合法的:

setGarbageCanForPlastic(new GarbageCan[Item])

现在,doSomething 函数接受一个逆变的 Type 参数。如果我不知道该类型是基类“Item”还是子类“PlasticItem”,我该如何使用该类型?我可以做一些在子类中允许而不是在基类中允许的事情。如果这是一个协变参数,那就没问题了,子类继承了基类的所有内容。

我弄丢了吗?...希望有人能帮助我。

最佳答案

首先,doSomething方法实际上除了基本上丢弃 a 之外不能做任何事情。因为它不知道什么A是。为了使其更有用,您需要像 class GarbageCan[-A <: Item] 这样的界限.

现在,假设 setGarbageCanForPlastic(gc)电话 gc.doSomething(new PlasticItem) .自 AGarbageCan[A]是逆变的,我们有GarbageCan[Item] <: GarbageCan[PlasticItem] <: GarbageCan[PlasticBottle] .事实上,函数调用 setGarbageCanForPlastic(new GarbageCan[Item]))是安全的 GarbageCan[Item]doSomething可以处理任何Item包括 PlasticItem , 同时调用 setGarbageCanForPlastic(new GarbageCan[PlasticBottle]))不安全因为 GarbageCan[PlasticBottle]doSomething可能无法接受 PlasticItem这不一定是 PlasticBottle .

关于scala - scala 中的逆变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38207310/

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