scala – 路径依赖类型是子类型吗?
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是路径依赖类型吗?! (这是我迄今为止的理解) 解决方法
优秀的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 ^ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |