加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

为什么函数[-A1,…,B]不能允许任何超类型作为参数?

发布时间:2020-12-16 09:41:59 所属栏目:安全 来源:网络整理
导读:我相信人们可以将协方差(至少是对象)定义为“使用较窄(次)类型的值替代较宽(超级)类型的值的能力”,并且这种相反性与这个。 显然,Scala函数是用于反变量参数类型A1等的函数[-A1,…,B]的实例,以及协变返回类型B.虽然这对于子函数的功能非常方便,但上述
我相信人们可以将协方差(至少是对象)定义为“使用较窄(次)类型的值替代较宽(超级)类型的值的能力”,并且这种相反性与这个。

显然,Scala函数是用于反变量参数类型A1等的函数[-A1,…,B]的实例,以及协变返回类型B.虽然这对于子函数的功能非常方便,但上述定义不应意味着可以通过任何超类型作为参数?

请告诉我哪里错了。

解决方法

协方差和矛盾是班级的质量不是参数的质量。 (它们是依赖于参数的素质,但是它们对类进行了说明。)

所以Function1 [-A,B]意味着一个取A的超类的函数可以被看作是原始函数的一个子类。

让我们在实践中看到这一点:

class A
class B extends A
val printB: B => Unit = { b => println("Blah blah") }
val printA: A => Unit = { a => println("Blah blah blah") }

现在假设你需要一个知道如何打印B的功能:

def needsB(f: B => Unit,b: B) = f(b)

你可以通过printB。但是你也可以通过printA,因为它也知道如何打印B(和更多!),就像A =>单位是B =>的子类单元。这正是矛盾的意思。这并不意味着您可以将Option [Double]传递到printB,并且可以得到任何东西,但编译时错误!

(协方差是另一种情况:M [B]<:M [A]如果B <:A.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读