成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Kotlin類型安全閥門:簡單理解in和out流向控制,拒絕類型翻車!

開發 前端
in和out就像給代碼加上智能閥門。記住:當需要安全地處理繼承關系中的類型轉換時,這兩個關鍵字就是你的類型安全衛士。下次寫泛型時,先問自己:這個容器是用來取東西還是裝東西的??

在開發中,Kotlin泛型類型的安全性就像水杯的「防燙設計」——in和out這兩個關鍵字能幫我們避免類型燙傷。

理解Kotlin中的in和out

場景一:安全的容器(out關鍵字)想象你有一個只能倒水的飲水機,這就是out的作用。我們定義飲水機接口:

interface WaterDispenser<out T> {
    fun pour(): T  // 只能倒水
}

class ColdWater : Water()  // 冷水類型
open class Water()         // 基礎水類型

// 冷水機實現
class ColdDispenser : WaterDispenser<ColdWater> {
    override fun pour() = ColdWater()
}

fun main() {
    // 基礎飲水機裝冷水(安全操作)
    val dispenser: WaterDispenser<Water> = ColdDispenser()
    val myWater: Water = dispenser.pour()
    
    // dispenser.reload(ColdWater())  ← 會報錯!這里禁止裝水
}

關鍵點:

? 當使用out時,相當于給容器貼上「只出不進」的標簽

? 允許把冷水機當作普通飲水機使用(向上兼容)

? 禁止添加任何裝水的方法(編譯器會報錯)

場景二:智能垃圾桶(in關鍵字)現在有個只能裝垃圾的智能垃圾桶,這就是in的作用。定義垃圾處理接口:

interface TrashBin<in T> {
    fun dispose(item: T)// 只能裝垃圾
}

open class Garbage        // 基礎垃圾
class FoodWaste : Garbage()  // 廚余垃圾

// 廚余垃圾桶實現
class FoodBin : TrashBin<FoodWaste> {
    overridefun dispose(item: FoodWaste) {
        println("處理廚余垃圾:${item.hashCode()}")
    }
}

fun main() {
    // 普通垃圾桶裝廚余垃圾(安全操作)
    val bin: TrashBin<FoodWaste> = FoodBin()
    bin.dispose(FoodWaste())
    
    // val found = bin.retrieve()  ← 會報錯!禁止取垃圾
}

關鍵點:

  • ?in相當于「只進不出」的封印
  • ? 允許處理更具體的垃圾類型(向下兼容)
  • ? 禁止任何取垃圾的操作(編譯保護)

類型安全的三把鑰匙

生產消費模型:

? 生產者用out(如數據讀取器)

interface DataReader<out T> {
    fun readNext(): T
}

? 消費者用in(如數據處理器)

interface DataProcessor<in T> {
    fun process(input: T)
}

集合操作示例

fun copyData(src: List<out String>, dest: MutableList<in String>) {
    for (item in src) {
        dest.add(item)  // 安全操作:src只讀,dest只寫
    }
}

錯誤規避指南

錯誤場景

編譯器提示

在out類型中嘗試寫入

Type mismatch 錯誤

在in類型中嘗試讀取

Cannot access 'XXX' 錯誤

混用泛型修飾符

Conflicting variance 錯誤

為什么需要方向控制?

? 防止數據污染:就像不能把臟水倒回飲水機

? 提升代碼彈性:冷水機可以當作普通飲水機使用

? 編譯期類型檢查:在寫代碼時就發現問題,避免運行時崩潰

總結就是:

? 向外拿用out(輸出數據)

? 往里塞用in(輸入數據)

? 泛型箭頭方向:out相當于? extends T,in相當于? super T

通過控制數據流向,in和out就像給代碼加上智能閥門。記住:當需要安全地處理繼承關系中的類型轉換時,這兩個關鍵字就是你的類型安全衛士。下次寫泛型時,先問自己:這個容器是用來取東西還是裝東西的?

責任編輯:武曉燕 來源: 沐雨花飛碟
相關推薦

2009-08-19 16:39:44

C#值類型C#引用類型

2009-09-23 14:23:51

Hibernate主鍵

2009-08-27 16:39:26

C# String類型

2021-04-16 07:19:04

Hive數據類型Hql

2022-02-25 09:06:02

TypeScripnever工具

2023-12-11 14:19:00

Java程序異常

2009-09-17 11:35:40

Linq匿名類型

2009-09-11 10:16:07

Linq匿名類型

2009-07-22 09:53:57

Scala底層類型

2009-11-19 10:43:54

Oracle Clob

2019-04-12 14:26:17

Linux命令文件

2009-08-31 14:34:46

C#值類型C#結構類型

2009-10-10 09:53:07

.NET值類型

2024-09-26 07:29:19

2019-08-23 09:58:18

Linux控制臺命令

2010-07-05 16:13:34

2009-08-03 17:51:43

C#引用類型

2009-09-01 18:05:17

C#類型聲明

2009-09-03 16:55:58

C#引用類型

2009-08-27 10:19:22

C#匿名類型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费在线观看av网站 | 日韩在线观看视频一区 | 国产精品波多野结衣 | www.888www看片 | 精品一区av | 美女精品一区 | 中国大陆高清aⅴ毛片 | 亚洲码欧美码一区二区三区 | 久久免费视频2 | 亚洲综合久久精品 | 久久久精 | 日韩午夜 | 91午夜在线 | 国产欧美精品一区二区三区 | 日韩一区二区三区视频 | 国精品一区 | 操操操av | www国产精品 | 色天天综合 | 一区二区三区在线 | 欧美日一区二区 | 黄色一级片在线播放 | 国产一区二区精品在线 | 亚洲第一av | 日日日日日日bbbbb视频 | 青青久视频| 少妇特黄a一区二区三区88av | 国产美女精品视频免费观看 | 久久久久se | 久干网| 日韩高清中文字幕 | 在线观看成人小视频 | 性高湖久久久久久久久3小时 | 精品国产乱码久久久久久丨区2区 | 国产激情福利 | h视频在线看 | 欧美不卡在线 | 亚洲国产成人久久综合一区,久久久国产99 | 日韩精品视频一区二区三区 | 欧美视频一区二区三区 | 久热9 |