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

scala – 路径依赖类型是子类型吗?

发布时间:2020-12-16 09:09:07 所属栏目:安全 来源:网络整理
导读:trait A { trait B { def foo: A.this.B = new B{} def bar: A#B = foo def baz: A.this.B = bar // type mismatch; found : A#B required: A.this.B }} 我是对的A.this.B是路径依赖类型吗?! (这是我迄今为止的理解) 上面的例子是否意味着A.this.B类型是A#
trait A {
  trait B {
    def foo: A.this.B = new B{}
    def bar: A#B      = foo 
    def baz: A.this.B = bar // type mismatch; found : A#B required: A.this.B 
  }
}

我是对的A.this.B是路径依赖类型吗?! (这是我迄今为止的理解)
上面的例子是否意味着A.this.B类型是A#B的子类型? (如果是的话,我猜不同之处在于A.this.B的实例引用了A的实例而不是A#B而不是?)
有没有人知道一个启发性的解释,解决了我对这两种类型的困惑?

解决方法

优秀的Scala编程有一个非常好的 explanation:

class Outer {
  class Inner
}

在Scala中,内部类使用表达式Outer#Inner而不是Java的Outer.Inner来寻址.的.语法是为对象保留的.例如,假设您实例化了两个Outer类型的对象,如下所示:

val o1 = new Outer
val o2 = new Outer

这里o1.Inner和o2.Inner是两种与路径相关的类型(它们是不同的类型).这两种类型都符合(是子类型)更通用的类型Outer#Inner,它表示具有Outer类型的任意外部对象的Inner类.相比之下,类型o1.Inner指的是具有特定外部对象(从o1引用的那个)的Inner类.同样,类型o2.Inner引用具有不同的特定外部对象(从o2引用的那个)的Inner类.

在Scala中,与Java一样,内部类实例包含对封闭外部类实例的引用.例如,这允许内部类访问其外部类的成员.因此,如果不以某种方式指定外部类实例,则无法实例化内部类.一种方法是在外部类的实体内实例化内部类.在这种情况下,将使用当前外部类实例(从中引用).另一种方法是使用路径依赖类型.例如,因为类型o1.Inner命名特定的外部对象,所以可以实例化它:

scala> new o1.Inner
res1: o1.Inner = Outer$Inner@13727f

生成的内部对象将包含对其外部对象的引用,该对象是从o1引用的对象.相比之下,因为类型Outer#Inner没有命名任何特定的Outer实例,所以无法创建它的实例:

scala> new Outer#Inner
<console>:6: error: Outer is not a legal prefix for
  a constructor
       new Outer#Inner
                 ^

(编辑:李大同)

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

    推荐文章
      热点阅读