类型投影|学习笔记

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

开发者学堂课程【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 中内部类的语法操作,我们将这种方式称之为类型投影(即:忽略对象的创建方式,只考虑类型)

相关文章
|
8月前
|
微服务
什么是微服务?微服务的优缺点是什么?
微服务就是一个独立的职责单一的服务应用程序,一个模块 1.优点:松耦合,聚焦单一业务功能,无关开发语言,团队规模降低 , 扩展性好, 天然支持分库2.缺点:随着服务数量增加,管理复杂,部署复杂,服务器需要增多,服务通信和调用压力增大
|
8月前
|
缓存 数据库
什么是缓存雪崩 ? 怎么解决 ?
缓存雪崩/缓存失效 指的是大量的缓存在同一时间失效,大量请求落到数据库 导致数据库瞬间压力飙升。 造成这种现象的 原因是,key的过期时间都设置成一样了。 解决方案是,key的过期时间引入随机因素
Qt下载(使用国内镜像)
Qt下载(使用国内镜像)
7147 2
|
存储 算法
《数据结构》---术语篇
《数据结构》---术语篇
271 0
|
6天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
15天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
10天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
617 215
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
859 61