Android面試題之Kotlin泛型和reified關鍵字

本文首發于公眾號“AntDream”,歡迎微信搜索“AntDream”或掃描文章底部二維碼關注,和我一起每天進步一點點

//泛型
class MagicBox<T>(item:T){var available = falseprivate var subject:T = itemfun fetch() : T? {return subject.takeIf { available }}//參數是匿名函數,傳入T,返回Rfun <R> fetch(subjectFunction: (T) -> R) : R? {return subjectFunction(subject).takeIf { available }}
}
class Boy(val name:String, val age:Int)
class Man(val name:String, val age:Int)
class Dog(val weight:Int)fun main() {val box1 = MagicBox(Boy("java", 10))val box2 = MagicBox(Dog(10))box1.available = truebox1.fetch()?.run {println("you find $name")}val man = box1.fetch {Man(it.name, it.age+10)}println("${man?.name}, ${man?.age}")
}

泛型in和out關鍵字

//out
interface Production<out T>{fun product(): T
}//in
interface Consumer<in T>{fun consume(item: T)
}//不變
interface ProductionConsumer<T>{fun product():Tfun consume(item: T)
}open class Food
open class FastFood: Food()
class Burger : FastFood()class FoodStore : Production<Food>{override fun product(): Food {println("Produce food")return Food()}
}
class FastFoodStore : Production<FastFood>{override fun product(): FastFood {println("Produce FastFood")return FastFood()}
}
class BurgerStore : Production<Burger>{override fun product(): Burger {println("Produce Burger")return Burger()}
}class EveryBody: Consumer<Food>{override fun consume(item: Food) {println("consume food")}
}
class ModernPeople: Consumer<FastFood>{override fun consume(item: FastFood) {println("consume FastFood")}
}
class American: Consumer<Burger>{override fun consume(item: Burger) {println("consume FastFood")}
}fun main() {//子類泛型對象可以賦值給父類泛型對象,用outval production1: Production<Food> = FoodStore()val production2: Production<Food> = FastFoodStore()val production3: Production<Food> = BurgerStore()//父類泛型對象可以賦值給子類泛型對象,用inval consumer1: Consumer<Burger> = EveryBody()val consumer2: Consumer<Burger> = ModernPeople()val consumer3: Consumer<Burger> = American()
}
reified關鍵字
  • 和inline一起使用,reified關鍵字能幫你檢查泛型的參數類型。kotlin不允許對泛型參數T做類型檢查,因為泛型參數類型會被類型擦除,也就是說T的類型信息在運行時是不可知的
//泛型 //inline和reified關鍵字一起使用,以便檢查泛型參數類型 
class MagicBox2<T: Human>(){
//隨機產生一個對象,如果不是指定類型的對象,則通過backup生成指定類型的對象inline fun <reified T> randomOrBackup(backup:() -> T): T{val items = listOf(Boy2("Jav2k",30),Man2("John3", 45))val random = items.shuffled().first()println(random)return if (random is T) {random} else{backup()}}
}
open class Human(val age: Int) class Boy2(val name:String, age:Int): Human(age) { override fun toString(): String { return "Boy2(name='age')" } 
} 
class Man2(val name:String, age:Int): Human(age) { override fun toString(): String { return "Man2(name='age')" } 
}fun main() { val box1: MagicBox2 = MagicBox2()val subject = box1.randomOrBackup { Boy2("java",23) } println(subject) }

歡迎關注我的公眾號查看更多精彩文章!

AntDream

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

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

相關文章

Ubuntu徹底卸載Nginx

停止Nginx服務 sudo systemctl stop nginx卸載Nginx軟件包 sudo apt purge nginx nginx-common nginx-core清除配置文件和依賴項 清除Nginx的配置文件 sudo rm -rf /etc/nginx清除Nginx安裝的依賴項 sudo apt autoremove清除相關文件和目錄 刪除Nginx的日志文件 sudo rm…

配置旁掛二層組網直接轉發示例(命令行)

業務需求 企業用戶通過WLAN接入網絡&#xff0c;以滿足移動辦公的最基本需求。且在覆蓋區域內移動發生漫游時&#xff0c;不影響用戶的業務使用。 組網需求 AC組網方式&#xff1a;旁掛二層組網。DHCP部署方式&#xff1a; AC作為DHCP服務器為AP分配IP地址。匯聚交換機SwitchB作…

深度學習基礎之《TensorFlow框架(18)—卷積神經網絡(2)》

一、卷積層 1、卷積層&#xff08;Convolutional Layer&#xff09;介紹 卷積神經網絡中每層卷積層由若干卷積單元&#xff08;卷積核&#xff09;組成&#xff0c;每個卷積單元的參數都是通過反向傳播算法最佳化得到的 卷積運算的目的是特征提取&#xff0c;第一層卷積層可能…

Gradle和Maven項目解決Spring Boot Configuration Annotation Processor not configured警告

問題描述 寫了一個配置類,加了注解@ConfigurationProperties(prefix = “xxx”) 后一直報警告:Spring Boot Configuration Annotation Processor not configured 意思是 Spring boot 未配置注解處理器 解決過程 出現這個問題后,百度查了解決方式 1.maven項目 maven項目是…

學習前端第四十四天(瀏覽器事件簡介)

一、事件處理程序 對事件作出響應&#xff0c;可以分配一個 處理程序 &#xff0c; 一個在事件發生時運行的函數 1、HTML特性綁定事件處理函數 <button id"btn1" οnclick"fn();console.log(xc)">保存1</button> 2、DOM屬性綁定事件處理函數…

純軟件雙機熱備

在信息化高速發展的今天&#xff0c;企業對于業務連續性的需求愈發強烈。無論哪個行業&#xff0c;系統的穩定運行都至關重要。為了確保系統的高可用性和業務連續性&#xff0c;純軟件雙機熱備技術應運而生&#xff0c;成為了企業IT架構中的關鍵一環。 雙機熱備軟件下載 …

04信號量

如果有兩個或者兩個以上的任務(進程 / 線程&#xff0c;并發的實體)&#xff0c;去訪問一個共享資源(硬件上面的&#xff0c;軟件上的)。我們必須要保證這個共享資源的有序訪問&#xff0c;否則會產生不可預知的后果 例子: very_important_i 5; // 共享資源 fun(…

vue3父組件使用ref獲取子組件的屬性和方法

在vue3中父組件訪問子組件中的屬性和方法是需要借助于ref: 1.<script setup> 中定義響應式變量 例如&#xff1a; const demo1 ref(null) 2.在引入的子組件標簽上綁定ref屬性的值與定義的響應式變量同名( <demo1 ref"demo1"/>)。 父組件代碼如下&…

cPanel中如何進行網站質量檢測

最近我在維護網站的時候需要查看網站質量如何&#xff0c;我使用的是Hostease的主機安裝的WordPress網站&#xff0c;隨后在咨詢了他們的技術支持后獲得了方法。 當您在cPanel中部署了網站后&#xff0c;確保網站的質量和性能是至關重要的。cPanel提供了一個便捷的功能Site Qu…

Postman進階功能-Mock服務與監控

大家好&#xff0c;前面跟大家分享一些關于 Postman 的進階功能&#xff0c;當我們深入探索 Postman 的進階功能時&#xff0c;Mock 服務與監控這兩個重要方面便躍然眼前。 首先&#xff0c;Mock 服務為我們提供了一種靈活便捷的方式&#xff0c;讓我們在某些實際接口尚未準備好…

18.SpringCloud Gateway

簡介 SpringCloud Gateway是spingcloud家族的產品&#xff0c;使用netty實現的高性能服務網關&#xff0c;用于替換netflix公司的zuul網關實現。 參考地址&#xff1a; https://spring.io/projects/spring-cloud 術語 工作原理 Route Predicate Factories GatewayFilte…

科大訊飛筆試題---字符串切割

1、 題目描述 小紅拿到了一個字符串&#xff0c;她希望你幫她切割成若干子串&#xff0c;滿足以下兩個條件&#xff1a; 子串長度均為不小于 3 的奇數。 子串內部的字符全部相同。 輸入 第一行輸入一個正整數n&#xff0c;代表字符串長度。第二行輸入一個字符串&#xff0c;僅…

前端基礎入門三大核心之HTML篇:解密標簽、標題與段落的藝術

前端基礎入門三大核心之HTML篇&#xff1a;解密標簽、標題與段落的藝術 一、HTML標簽&#xff1a;網頁元素的建筑磚石1.1 HTML標簽的基本概念1.2 基礎標簽示例自閉合標簽示例&#xff1a;圖片標簽 1.3 實戰應用&#xff1a;使用<meta>標簽優化網頁 二、標題標簽&#xff…

運行時間比較

subprocess.run() 函數參數的含義&#xff1a; shell_command&#xff1a;這是要執行的命令。它可以是一個字符串&#xff0c;也可以是一個包含命令和參數的列表。例如&#xff0c;“ls -l” 或 [“ls”, “-l”]。shellTrue&#xff1a;這是一個布爾值參數&#xff0c;指示是…

新一代分布式鏈路追蹤skywalking編碼實戰教程(下)

&#x1f680; 作者 &#xff1a;“二當家-小D” &#x1f680; 博主簡介&#xff1a;?前荔枝FM架構師、阿里資深工程師||曾任職于阿里巴巴擔任多個項目負責人&#xff0c;8年開發架構經驗&#xff0c;精通java,擅長分布式高并發架構,自動化壓力測試&#xff0c;微服務容器化k…

PostgresSQL開啟歸檔模式

文章目錄 一、查詢數據庫歸檔是否開啟1、查看數據目錄(找出conf文件位置)2、查看歸檔是否開啟 二、開啟歸檔模式&#xff08;開啟后有一定的性能損耗&#xff09;1、創建歸檔目錄2、修改postgresql.conf配置文件3、重啟pg 三、驗證歸檔情況1、查看歸檔是否開啟2、檢查點 , 刷新…

利用遠控工具橫向

一.橫向移動介紹和方式 1.介紹 內網滲透的橫向移動是指攻擊者在成功進入內網后&#xff0c;通過利用內部系統的漏洞或者獲取的合法訪問權限&#xff0c;從一個受感染的系統向其他系統擴散或移動。這種橫向移動的目的通常是為了獲取更多的敏感信息、提升權限、擴大攻擊面或者更…

【藍橋杯】

題目列表 - 洛谷 | 計算機科學教育新生態 (luogu.com.cn) #include<bits/stdc.h> using llunsigned long long; #define int ll const int N2e510; int k0; std::string s; int a,b,c,d; void solve() {char op;std::cin>>op;if(opA){std::string s;for(int i1;i&l…

文心一言指令解析

1、介紹 文心一言是一款靈感啟發類的產品&#xff0c;它以簡潔而深刻的文字表達來激發讀者的思考和感悟。該產品通過每天提供一句精選的短語&#xff0c;讓用戶在繁忙的生活中停下腳步&#xff0c;思考人生和內心的真實需求。 每一句文心一言都經過精心挑選&#xff0c;它們通…

小程序-滾動觸底-頁面列表數據無限加載

// index/index.vue <template> <!-- 自定義導航欄 --> <CustomNavbar /> <scroll-view scrolltolower"onScrolltolower" scroll-y class"scroll-view"> <!-- 猜你喜歡 --> <Guess ref"guessRef" /> </s…