类型投影|学习笔记

简介: 快速学习类型投影。

开发者学堂课程【Scala 核心编程-基础:类型投影】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/609/detail/9005


类型投影

 

1、跟嵌套类相关的类型投影

先看一段代码,引出类型投影

class ScalalnnerClass3 { //成员内部类

def test(ic: ScalalnnerClass3): Unit = {

System.out printIn(ic)

}

}

class ScalaOuterClass3 {

myOuter =>

// 这里我们去调用 testtest 属于内部对象

只要输入 Inner1,它就会自动关联到icouter1 . ScalaInnerClass)对应的外部对象如果输入 Inner2,就自动切换到icouter2 . ScalaInnerClass)在 java 中它是不管的java 的内部类它只看 ScalaInnerClass而 scala 中两个都要考虑如果调自己没有问题但是相互调就不行因为 Inner1自动关联 outer1。

Inner1.testinner1)

//在默认情况下scala 的内部类的实例和创建内部类实例的外部对象关联这样调用时就无法通用性的调用所以推出类型投影。

Inner1.testinner2)

Inner2.testinner2)

不管是内部的还是外部的只要投影完之后就一样了

2、直接将外部类 ScalalnnerClass 加到下面即可

//这里有一个方法,可以接受 ScalaInnerClass 实例

//下面的 ScalaOuterClass#ScalaOuterClass 类型投影的作用就是屏蔽外部对象对内部类对象的影响如果在开发中把一系列的内部类全部调用就可以使用这个投影

def test(ic: ScalalnnerClass#ScalaOuterClass): Unit = {

接收一个内部类型时不要再考虑外部类型只要是内部类型即可如果有意要区分就不要做类型投影

System.out printIn(‘’使用类型投影‘’+ic)

}

}

执行结果如下

name~ = jack sal~ =800.9

使用了类型投影 com. atguigu. chapter0o8. innerclass.scalaouterClass$scalaInnerClass@7dc36524

使用了类型投影 com. atguigu. chapter08. innerclass . ScalaouterClass$scalaInnerClass@35bbe5e8

使用了类型投影 com. atguigu. chapter08. innerclass . ScalaouterClass$ScalaInnerClass@35bbe5e8

3、对上面代码正确和错误的分析重点

object Scala01_ Class {

def main(args: Array[String]): Unit =

val outer1 : ScalaOuterClass3 = new ScalaOuterClass3();

val outer2 : ScalaOuterClass3 = new ScalaOuterClass3();

val inner1 = new outer1.ScalalnnerClass3()

val inner2 = new outer2.ScalalnnerClass3()

inner1.test(inner1)//ok, 因为需要outer1. ScalanInner

inner1.test(inner2)// error, 需要outer1.ScalanInner

outer2.ScalanInner

4、//说明下面调用 test 的正确和错误的原因:

//1.Java 中的内部类属于外部类,因此在 java 中 inner.test(inner2)就可以,因为是按类型来匹配的。

//2.Scala 中内部类从属于外部类的对象,所以外部类的对象不一样,创建出来的内部类也不一样,无法互换使用

解决方式-使用类型投影

类型投影是指在方法声明上,如果使用外部类#内部类的方式,表示忽略内部类的对象关系,等同于 Java 中内部类的语法操作,我们将这种方式称之为类型投影(即:忽略对象的创建方式,只考虑类型)

//3.比如你使用 ideal 看一下 在 inner1.test()的形参上,它提示的类型是 outer1.ScalaOuterClass,而不是ScalaOuterClass

inner1.test(inner1)//ok

inner1.test(inner2)//错误

5、整理

(1)先看一段代码引出类型投影

//外部类

//内部类访问外部类的属性的方法2使用别名的方式

//1. 将外部类属性,写在别名后面

class Scal aOuterClass {

myouter => //这里我们可以这里理解外部类的别名看做是外部类的个实例

class ScalaInnerClass { //成员内部类,

def info() = {

//访问方式:外部类别名.属性名

//只是这种写法比较特别,学习 java 的同学可能 更容易理解 Scalaouterclass.class 的写法

println(" name~ =”+ myouter . name

sal~ =" + myouter .sal)

}

//这里有一个方法,可以接受 scalaInnerclass 实例

//下面的 Scalaouterclass#ScalaInnerClass 类型投影的作用就是屏蔽外部对象对内部类对象的影响

def test(ic: Scal aouterClass#ScalaInnerClass): Unit = {

System. out. println("使用了类型投影”+ ic)

}

}

//定义两个属性

var name = "jack"

private var sal = 800.9

}

(2)解决方式-使用类型投影

类型投影是指在方法声明上,如果使用外部类#内部类的方式,表示忽略内部类的对象关系,等同于 Java 中内部类的语法操作,我们将这种方式称之为类型投影(即:忽略对象的创建方式,只考虑类型)

相关文章
|
9月前
|
微服务
什么是微服务?微服务的优缺点是什么?
微服务就是一个独立的职责单一的服务应用程序,一个模块 1.优点:松耦合,聚焦单一业务功能,无关开发语言,团队规模降低 , 扩展性好, 天然支持分库2.缺点:随着服务数量增加,管理复杂,部署复杂,服务器需要增多,服务通信和调用压力增大
|
9月前
|
缓存 数据库
什么是缓存雪崩 ? 怎么解决 ?
缓存雪崩/缓存失效 指的是大量的缓存在同一时间失效,大量请求落到数据库 导致数据库瞬间压力飙升。 造成这种现象的 原因是,key的过期时间都设置成一样了。 解决方案是,key的过期时间引入随机因素
Qt下载(使用国内镜像)
Qt下载(使用国内镜像)
7372 2
|
存储 算法
《数据结构》---术语篇
《数据结构》---术语篇
284 0
|
4天前
|
数据采集 人工智能 安全
|
13天前
|
云安全 监控 安全
|
5天前
|
自然语言处理 API
万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
1125 152
|
19天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1794 9