为说明类型投影的作用,先看一个Scala内部类的使用示例。该例演示的是Scala内部类的使用,在外部类Outter中定义内部类Inner,然后通过val outter1=new Outter、val inner=new outter1.Inner进行内部类的使用。
【例7-10】Scala内部类示例。
例7-10演示了Scala内部类的使用,从第12行代码可以看到,Scala访问内部类的方式同外部类的其他类成员一样,只不过它是一个内部类。众所周知,实例化后的不同外部类对象的成员变量是不一样的,也就是说outter1.x与outter2.x是两个不同的成员变量,其物理存储地址不同。类似地,不同Outter类的实例对应的内部类也是不一样的,下面的代码就是证明。该例的外部类中定义了def print(i:Inner)=i方法,该方法只能接受同一外部类对象引用所创建的内部类对象作为参数,而不能接受不同外部类对象创建的内部类对象作为参数。
【例7-11】不同Outter类的实例对应的内部类说明示例。
例7-11第10行、第11行代码创建了一个外部类的对象及对应的内部类对象,第13行、第14行代码创建了另外一个外部类对象及对应的内部类对象,第17行代码编译会出错,这是因为outter.Inner类与outter2.Inner类是不同的类,第23行代码说明了这一点。具体来讲,Outter类中def print(i:Inner)=i成员方法中的参数类型Inner其实相当于def print(i:this.Inner)=i或def print(i:Outter.this.Inner)=i,它依赖于外部类,构成了一条路径,因为也称为路径依赖类型。(www.daowen.com)
类型投影的目的是将外部类Outter中定义的方法def print(i:Inner)=i,它可以接受做任意外部类对象中的In⁃ner类,也就是使例7-11中outter与outter2中的Inner类型具有共同的父类,具体实现方式是将def print(i:Inner)=i改写为def print(i:Outter#Inner)=i,Outter#Inner称为类型投影,其原理如图7-1所示,完整代码如例7-12所示。该例通过类型投影即将def print(i:Inner)=i方法改为def print(i:Outter#Inner)=i解决例7-1中的问题。
【例7-12】类型投影使用示例。
图7-1 类型投影说明
例7-12第7行代码说明了类型投影的实现方式,第20行代码说明了类型投影的作用,通过类型投影,print方法可以接受任意outter实例的Inner类对象,但需要注意是代码第24行输出的结果仍然是false,这是因为类型投影并没有改变outter.Inner类与outter2.Inner类是不同类的事实,它只是改变了print方法的行为。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。