Scala 深入浅出实战经典 第52讲:Scala中路径依赖代码实战详解
王家林亲授《DT大数据梦工厂》大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频、PPT、代码下载:
百度云盘:http://pan.baidu.com/s/1c0noOt6
腾讯微云:http://url.cn/TnGbdC
360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2
土豆:http://www.tudou.com/programs/view/jeikRw_tlBM/
优酷:http://v.youku.com/v_show/id_XMTI4NDI4NTkwOA==.html?from=s1.8-1-1.2
爱奇艺:http://www.iqiyi.com/w_19rrx9i29p.html#vfrm=2-3-0-1
腾讯视频: http://v.qq.com/boke/page/s/0/u/s01598wtqzu.html
技术爱好者尤其是大数据爱好者 可以加DT大数据梦工厂的qq群
DT大数据梦工厂① :462923555
DT大数据梦工厂②:437123764
DT大数据梦工厂③ :418110145
微信公众账号: DT_Spark
王家林老师微信号: 18610086859
王家林老师QQ: 1740415547
王家林老师邮箱: 18610086859@126.com
本视频由王家林老师, 亲自讲解, 完全通过代码实战把您带人大数据的时代.
package com.parllay.scala.type_parameterizitor
/**
* Created by richard on 15-8-6.
*/
class Outer{
private val x = 10
class Inner {
private val y = x + 10
}
}
object Path_Dependence {
def main(args: Array[String]) {
val outer = new Outer
val inner = new outer.Inner
val inner2 : outer.Inner = new outer.Inner
val o1 = new Outer
val o2 = new Outer
//以下是会报错的
//val i: o2.Inner = new o1.Inner
//正确的使用方法是
val i: Outer#Inner = new o1.Inner
}
}
/**
* 先回顾一下java的内部类
class Outter{
public class Inner {}
public void foo(Inner c){
System.out.println(c);
}
}
public class Main {
public static void main(String[] args)throws Exception{
Outter o1 = new Outter();
Outter o2 = new Outter();
Outter.Inner i1 = o1.new Inner();
Outter.Inner i2 = o2.new Inner();
o1.foo(i2);
}
}
上面在Outter类内部定义了Inner类,在后边main里创建了两个Inner实例,注意创建内部类的时候
Outter.Inner i1 = o1.new Inner();
在用new创建内部类时,前边必须限定外部对象(内部类实例必须要访问到外部对象引用):o1;
如果是在 Outter类内部这个外部引用可以省略,它默认会用传递外部this引用。
class Outter {
public class Inner{}
public void test() {
new Inner(); // 相当于this.new Inner(); 也可以写为Outter.this.new Inner();
}
}
同样的事情翻译为scala代码:
scala> class A {
class B;
def foo(b:B) = println(b)
}
scala> val a1 = new A
scala> val a2 = new A
scala> val b1 = new a1.B
scala> val b2 = new a2.B
在创建内部类的时候,语法上与java有所不同,不是 outter.new Inner() 而是 new outter.Inner(),
看上去只是表象不同么?实际上,scala有很大差异,不同于java里 i1 和 i2 类型是相同的,
否则 o1.foo(i2) 就不能执行了,scala里的 b1 和 b2 是不同的类型:
scala> a1.foo(b2)
<console>:12: error: type mismatch;
found : a2.B
required: a1.B
按照方法的提示: a1.foo方法接受的参数类型为:a1.B,而传入的b2 类型是 a2.B,两者不匹配。
验证一下:
scala> typeOf[a1.B] == typeOf[a2.B]
res2: Boolean = false
确实是不一样的类型,它跟外部的实例相关,那个foo方法参数类型B的写法是缩写,省略了路径:
def foo(b: B) // 相当于 this.B 或 A.this.B
这里要引入一个概念:路径依赖类型;比如上面的 A.this.B 就是一个路径依赖类型,B
前面的路径 A.this 随着不同的实例而不同,比如 a1 和 a2 就是两个不同的路径,
所以a1.B 与 a2.B也是不同的类型。路径依赖类型的路径完整写法:
1) 内部类定义在object里面,路径:package.object.Inner
object Singleton {
class Inner
}
val x = new p1.p2.p3.Singleton.Inner
2) 内部类定义在class/trait 里
//2.1) 直接在外部类中使用内部类型,路径:this 或 Outter.this
class A {
class B
val b = new B // 相当于 A.this.B
}
//2.2) 在子类中使用父类的内部类型,路径:super 或 Child.super
class A { class B }
class C extends A { val x = new super.B } // 相当于 C.super.B
//2.3) 在其他类中使用,路径:outter(外部类实例)
class A { class B }
class C {
val a = new A
val x = new a.B
}
那现在的问题来了,怎么让 a1.foo 方法可以接收 b2 参数 ?
class A {
class B;
def foo(b:B) // 接收所有的B类型实例,而不只是foo的调用者实例(a1)路径下B类型的对象
println(b)
}
这又引出一个概念:类型投影(type projection)
在scala里,内部类型(排除定义在object内部的),想要表达所有的外部类A实例路径下的B类型,
即对 a1.B 和 a2.B及所有的 an.B类型找一个共同的父类型,这就是类型投影,用 A#B的形式表示。
A#B
/ \
/ \
a1.B a2.B
这样,我们只要修改一下 foo 方法里的参数类型
def foo(b: A#B)
就可以调用 a1.foo(b2) 了。
*/
Scala 深入浅出实战经典 第52讲:Scala中路径依赖代码实战详解的更多相关文章
- 第52讲:Scala中路径依赖代码实战详解
今天学习了scala中的路径依赖,来看一下实战代码 class Outer{ private val x = 10 class Inner{ private val y = x +10 } ...
- Scala深入浅出实战经典:29,Case class和Case object代码实战解析
今天学习了王家林老师scala讲座的第29讲,case class和case object的应用实战.做下记录. 信息来源于 DT大数据梦工厂微信公众账号:DT_Spark 关注微信账号,获取更多关于 ...
- Scala 深入浅出实战经典 第81讲:Scala中List的构造是的类型约束逆变、协变、下界详解
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-97讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- Scala 深入浅出实战经典 第79讲:单例深入讲解及单例背后的链式表达式
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- Scala 深入浅出实战经典 第78讲:Type与Class实战详解
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...
- Scala 深入浅出实战经典 第77讲:模式匹配下的提取器动手构造实战
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- Scala 深入浅出实战经典 第76讲:模式匹配下的赋值语句
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...
- Scala 深入浅出实战经典 第75讲:模式匹配下的For循环
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...
- Scala 深入浅出实战经典 第68讲:Scala并发编程原生线程Actor、Cass Class下的消息传递和偏函数实战解析
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...
随机推荐
- python基础语法(1)
一.基本概念 1. python中数有四种类型:整数.长整数.浮点数和复数. 整数, 如 1 长整数 是比较大的整数 浮点数 如 1.23.3E-2 复数 如 1 + 2j. 1.1 + 2.2j 2 ...
- Excel VBA自动添加证书(二)
继续上次没有写完的随笔,本来是很想一次性写完的,但是到中午一点了还没有吃东西,其实饿的不行了,还好写博客时会自动保存,中间电脑实然蓝屏,花了二个多小时写的没有点击保存,吓我一下,以为会全没了. 前面讲 ...
- h5专题应该兼容那些浏览器?
本人做专题还不算很多,但是也很腻烦了.一般一个专题制作也就3天,可是调试得4/5天.除了销售客户各种无休止的改改改.还有一点很重要就是浏览器的兼容性.刚开始做专题的时候天真的以为苹果只要兼容到ipho ...
- 《Linux内核设计与实现》读书笔记(十三)- 虚拟文件系统
虚拟文件系统(VFS)是linux内核和具体I/O设备之间的封装的一层共通访问接口,通过这层接口,linux内核可以以同一的方式访问各种I/O设备. 虚拟文件系统本身是linux内核的一部分,是纯软件 ...
- delphi中获取调用堆栈信息
异常堆栈有利于分析程序的错误,Delphi的Exception有StackTrace属性,但是值为空,因为StackTrace的信息收集Delphi委托给了第三方组件来完成,真是脑子有毛病! 借助于m ...
- [Microsoft Test Manager]CodeUI初探
开发环境: Widnows8 Microsoft Visual Studio Ultimate 2012 1. 新建一个 Windows Forms Application Figue1 Cr ...
- IE11下Forms身份认证无法保存Cookie的问题
ASP.NET中使用Forms身份认证常见的做法如下: 1. 网站根目录下的Web.config添加authentication节点 <authentication mode="For ...
- 汇编int21h,DOS调用(转)
表:DOS系统功能调INT 21H AH 功能 调用参数 返回参数 00 程序终止(同INT 20H) CS=程序段前缀 01 键盘输入并回显 AL=输入字符 02 显示输出 DL=输出字符 03 异 ...
- atitit.web原理 理论attilax总结
atitit.web原理 理论attilax总结 1. Web3.01 2. Web的未来趋势1 3. Web语言与应用导论_百度百科.html2 4. <Web设计与编程导论(影印版)> ...
- atitit.web的动态include 跟变量传递 java .net php
atitit.web的动态include 跟变量传递 java .net php 1. 动态include <jsp:include 1 2. 使用QueryString 1 3. 使用Ses ...