自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

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

理解Kotlin中的in和out

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

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

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

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

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

關(guān)鍵點:

? 當(dāng)使用out時,相當(dāng)于給容器貼上「只出不進(jìn)」的標(biāo)簽

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

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

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

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

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

// 廚余垃圾桶實現(xiàn)
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()  ← 會報錯!禁止取垃圾
}

關(guān)鍵點:

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

類型安全的三把鑰匙

生產(chǎn)消費模型:

? 生產(chǎn)者用out(如數(shù)據(jù)讀取器)

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

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

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只寫
    }
}

錯誤規(guī)避指南

錯誤場景

編譯器提示

在out類型中嘗試寫入

Type mismatch 錯誤

在in類型中嘗試讀取

Cannot access 'XXX' 錯誤

混用泛型修飾符

Conflicting variance 錯誤

為什么需要方向控制?

? 防止數(shù)據(jù)污染:就像不能把臟水倒回飲水機(jī)

? 提升代碼彈性:冷水機(jī)可以當(dāng)作普通飲水機(jī)使用

? 編譯期類型檢查:在寫代碼時就發(fā)現(xiàn)問題,避免運行時崩潰

總結(jié)就是:

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

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

? 泛型箭頭方向:out相當(dāng)于? extends T,in相當(dāng)于? super T

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

責(zé)任編輯:武曉燕 來源: 沐雨花飛碟
相關(guān)推薦

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數(shù)據(jù)類型Hql

2022-02-25 09:06:02

TypeScripnever工具

2023-12-11 14:19:00

Java程序異常

2009-07-22 09:53:57

Scala底層類型

2009-11-19 10:43:54

Oracle Clob

2009-09-11 10:16:07

Linq匿名類型

2009-09-17 11:35:40

Linq匿名類型

2019-04-12 14:26:17

Linux命令文件

2009-10-10 09:53:07

.NET值類型

2009-08-31 14:34:46

C#值類型C#結(jié)構(gòu)類型

2019-08-23 09:58:18

Linux控制臺命令

2009-08-27 10:19:22

C#匿名類型

2009-09-03 16:55:58

C#引用類型

2009-09-01 18:05:17

C#類型聲明

2009-08-03 17:51:43

C#引用類型

2010-07-05 16:13:34

2024-09-26 07:29:19

點贊
收藏

51CTO技術(shù)棧公眾號