scala隱式類

1 定義
隱式類指的是用implicit關鍵字修飾的類。在對應的作用域內,帶有這個關鍵字的類的主構造函數可用于隱式轉換。

2示例
現在有一個需求:有一個 Person 類,含有work()方法,有一個 Student 類,含有study()方法,在不使用繼承的情況下,要求創建一個Person類的對象,可以直接調用Student類里的study()方法?

方法①: 使用 隱式類 ,將Student類定義為隱式類,這樣在 new Person對象的時候, 編譯器會默認在Student的主構造方法中傳入Person對象,再轉型為Student對象,這樣新建的Person對象就有了雙重身份,可以隨便調用這兩個類中的方法
代碼如下:
創建一個scala class文件: Person

?class Person() {? ?
? def work()={
? ? println("人每天都要工作")
? }
}

object Test1{
?implicit class Student(obj:Person){? ?
? ?def study()={ ? ? ? ? ? ? ? //重點:主構造方法傳入的類型必須要有-----> ?Person ? ? ? ? ?
? ? ?println("喜歡學習scala")
? ?}
?}

? def main(args: Array[String]): Unit = {
? ? val person: Person = new Person?
? ? person.work()
? ? person.study()??
? }
}
1

注:

創建隱式類,主構造函數中必須要引入一個目標類當參數,且隱式類必須要在 object 中創建
本文是將隱式類與目標類寫在了一個scala文件中,當隱式類寫在其他文件中,調用時引入該隱式類所在的包即可
方法②: 使用 隱式函數 轉換,創建Person對象時,編譯器默認會將Person對象轉為Student對象,從而使得新建的Person對象有了雙重身份,可以隨便調用這兩個類中的方法
代碼如下:
創建一個scala class文件: Person

class Person() {? ?
? def work()={
? ? println("人每天都要工作")
? }
}

class Student(){??
? def study()={ ? ? ? ? ? ? ??
? ? println("喜歡學習scala")
? }
}

object Test1{

? //重點:定義一個隱式函數,將 Person 轉為 Student
? implicit def personToStudent(obj:Person):Student = new Student
??
? def main(args: Array[String]): Unit = {
? ? val person: Person = new Person?
? ? person.work()
? ? person.study()??
? }
}


注:

使用隱式函數,Studnet類只需定義為一個普通類即可
Person類可以使用多個隱式函數轉型,從而使用其他類中的方法

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63079.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63079.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63079.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Swin Transformer:用Transformer實現CNN多尺度操作

文本是關于Swin Transformer基礎知識的了解 論文:https://arxiv.org/pdf/2103.14030 項目:https://github. com/microsoft/Swin-Transformer. 實現一個Swin Transformer:Swin Transformer模型具體代碼實現-CSDN博客 Swin Transformer mlp…

系列2:基于Centos-8.6Kubernetes 集成GPU資源信息

每日禪語 自省,就是自我反省、自我檢查,自知己短,從而彌補短處、糾正過失。佛陀強調自覺覺他,強調以達到覺行圓滿為修行的最高境界。要改正錯誤,除了虛心接受他人意見之外,還要不忘時時觀照己身。自省自悟之…

flutter控件buildDragTargetWidget詳解

文章目錄 1. DragTarget 的核心概念基本屬性 2. 基本用法3. 使用 buildDragTargetWidget4. 常見場景5. 注意事項 buildDragTargetWidget 不是 Flutter 中的內置 API 或方法,但根據命名習慣,它很可能是您正在實現或使用的一個方法,用于在 Flut…

MySQL遷移SQLite

將 MySQL 的表結構和數據遷移到 SQLite,可以通過以下步驟實現。這個過程主要包括導出 MySQL 數據庫到 SQL 文件,然后將其導入到 SQLite 數據庫中。 步驟 1: 導出 MySQL 數據庫 首先,需要將 MySQL 數據庫導出為一個 SQL 文件。可以使用 mysq…

【數據結構——內排序】二路歸并排序(頭歌實踐教學平臺習題)【合集】

目錄😋 任務描述 測試說明 我的通關代碼: 測試結果: 任務描述 本關任務:實現二路歸并算法。 測試說明 平臺會對你編寫的代碼進行測試: 測試輸入示例: 11 18 2 20 34 12 32 6 16 5 8 1 (說明:第一行是元…

近期數據安全事件通報處罰案例分析與建議

近期典型事件案例 案例一:北京某公司未建立數據安全管理制度和操作規程,造成大量公民個人信息泄露 北京某公司的數據管理人員,某天發現公司的客戶數據疑似泄露在境外非法網站上隨后報警。經檢查,該公司的技術人員在數據庫系統測試…

基于 webRTC Vue 的局域網 文件傳輸工具

文件傳輸工具,匿名加密,只需訪問網頁,即可連接到其他設備,基于 webRTC 和 Vue.js coturn TURN 服務器 docker pull coturn/coturn docker run -d --networkhost \-v $(pwd)/my.conf:/etc/coturn/turnserver.conf \coturn/coturn…

【FFmpeg】FFmpeg 內存結構 ⑥ ( 搭建開發環境 | AVPacket 創建與釋放代碼分析 | AVPacket 內存使用注意事項 )

文章目錄 一、搭建開發環境1、開發環境搭建參考2、項目搭建 二、AVPacket 創建與釋放代碼分析1、AVPacket 創建與釋放代碼2、Qt 單步調試方法3、單步調試 - 分析 AVPacket 創建與銷毀代碼 三、AVPacket 內存使用注意事項1、謹慎使用 av_init_packet 函數2、av_init_packet 函數…

D94【python 接口自動化學習】- pytest進階之fixture用法

day94 pytest的fixture詳解 學習日期:20241210 學習目標:pytest基礎用法 -- pytest的fixture詳解 學習筆記: fixture的介紹 fixture是 pytest 用于將測試前后進行預備、清理工作的代碼處理機制。 fixture相對于setup和teardown來說有以…

2024首屆世界酒中國菜國際地理標志產品美食文化節成功舉辦篇章

2024首屆世界酒中國菜國際地理標志產品美食文化節成功舉辦,開啟美食文化交流新篇章 近日,首屆世界酒中國菜國際地理標志產品美食文化節在中國國際地理標志大廈成功舉辦,這場為期三天的美食文化盛會吸引了來自世界各地的美食愛好者、行業專家…

AI發展與LabVIEW程序員就業

人工智能(AI)技術的快速發展確實對許多行業帶來了變革,包括自動化、數據分析、軟件開發等領域。對于LabVIEW程序員來說,AI的崛起確實引發了一個值得關注的問題:AI會不會取代他們的工作,導致大量失業&#x…

展柜設計公司平面布置小程序的分析與設計springboot+論文源碼調試講解

3系統的需求分析 需求分析的任務是通過詳細調查展柜設計公司平面布置小程序軟件所需的對象,充分了解系統的工作概況,明確功能實現的各種需求,然后在此基礎上確定系統的功能。系統必須充分考慮今后可能的擴充和改變。 3.1可行性分析 通過對…

家校通小程序實戰教程10部門管理前后端連接

目錄 1 加載后端的數據2 為什么不直接給變量賦值3 保存部門信息4 最終的效果5 總結 現在部門管理已經完成了后端功能和前端開發,就需要在前端調用后端的數據完成界面的展示,而且在錄入部門信息后需要提交到數據庫里,本篇我們介紹一下前后端如…

spark-sql 備忘錄

wordcount sc.textFile("../data/data.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(__).collect 讀取json 文件 并通過sql 執行 join 查詢 public static void main(String[] args) {SparkSession session SparkSession.builder().master(&qu…

Java并發編程學習(二)

線程的狀態 有說5種的,有說6種的 5種的,從操作系統層面來講 初始狀態:也就是語言層面創建了線程對象,還未與操作系統線程關聯。Java中也就是new了一個線程,還未調用。可運行狀態:(就緒狀態&a…

Docker方式安裝人人影視離線完整安裝包

本文軟件由網友 ルリデ 推薦; 上周,人人影視創始人宣布將人人影視二十年字幕數據開源分享 目前提供了兩種使用方式: “在線應用” :意味著需要有互聯網才可以使用。官方提供了網站:https://yyets.click “離線使用” …

Leetcode 3389. Minimum Operations to Make Character Frequencies Equal

Leetcode 3389. Minimum Operations to Make Character Frequencies Equal 1. 解題思路2. 代碼實現 題目鏈接:3389. Minimum Operations to Make Character Frequencies Equal 1. 解題思路 這一題從答題從test的結果來說來說做出的人很少,主要確實有些…

大文件處理的終極武器:Yield詳解

【大文件處理的終極武器:Yield詳解】🚀 一、大文件處理的痛點 內存限制數據量巨大傳統方法效率低 二、Yield解決方案 def read_large_file(file_path):with open(file_path, r) as file:# 每次只讀取一行,而不是全文for line in file:yie…

SpringBoot 學習

SpringBoot 學習 什么是 Springboot Spring Boot 是 Spring 提供的一個子項目,用于快速構建 Spring 應用程序 傳統的問題: 導入依賴繁瑣項目配置繁瑣 SpringBoot 的特性 起步依賴:整合所有 web 的依賴配置好了自動配置:bean…

到達率的變化動態調整服務器的服務率,實現負載均衡,提高資源利用效率

中心可以根據任務到達率的變化動態調整服務器的服務率,實現負載均衡,提高資源利用效率 服務率和到達率 中心可以根據任務到達率的變化動態調整服務器的服務率,實現負載均衡,提高資源利用效率服務率(Service Rate)到達率(Arrival Rate)控制參數實現負載均衡的方法在云計…