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

在Scala中,如何在包含类之外的嵌套类型中构建工厂?

发布时间:2020-12-16 09:05:27 所属栏目:安全 来源:网络整理
导读:用一个例子解释: class A { def f = { val b: B = C.factory(this).asInstanceOf[B] } class B}object C { def factory(a: A): A#B = new a.B} C.factory是用于创建A#B的新实例的函数.由于B是嵌套类型,我在函数签名中包含了一个A引用.调用函数f必须转换从工
用一个例子解释:

class A {
    def f = {
        val b: B = C.factory(this).asInstanceOf[B]
    }
    class B
}

object C {
    def factory(a: A): A#B = new a.B
}

C.factory是用于创建A#B的新实例的函数.由于B是嵌套类型,我在函数签名中包含了一个A引用.调用函数f必须转换从工厂返回的引用,我想避免.没有演员,我得到:

error: type mismatch;
found   : A#B
required: A.this.B

解决方法

这取决于你想要什么.在A中,B表示this.B,它是从封闭实例创建的B.确实,你的工厂会回报这个问题,但事实并非如此.它只是说它返回A#B(称为类型投影),一个未指定的A实例的B.如果,对于你的val b,你不关心它是由哪个实例创建的,那么你应该用val b来说:A#B(或者让编译器推断它).

如果你确实关心它是你A的B而不是其他人,你可能会失去运气.您的工厂返回由a参数创建的B实例.但你的签名并没有这么说.您可能需要a.B而不是不太精确的类型投影A#B.唉,语言不允许这样.您将获得错误非法依赖方法类型:当您编写依赖类型a.B时,a必须是“稳定标识符”,并且方法参数不被视为一个.也许this blog post可能有所帮助

(编辑:李大同)

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

    推荐文章
      热点阅读