【Kotlin进阶】泛型的高级特性

文章目录

  • [1. 基本概念](#1. 基本概念)
  • [2. 理解泛型擦除](#2. 理解泛型擦除)
  • [3. 不变,协变,逆变](#3. 不变,协变,逆变)
    • [3.1 不变](#3.1 不变)
    • [3.2 协变](#3.2 协变)
      • [1. 基础定义](#1. 基础定义)
      • [2. 案例分析:接口类List](#2. 案例分析:接口类List)
    • [3.3 逆变](#3.3 逆变)
  • [4. 星投影](#4. 星投影)
  • [5. 内联实化](#5. 内联实化)

1. 基本概念

2. 理解泛型擦除

3. 不变,协变,逆变

3.1 不变

3.2 协变

1. 基础定义

  • 如果 A 是 B 的子类型,并且Generic< A> 也是 Generic< B > 的子类型,那么 Generic
    可以称之为一个协变类。
  • 需要在泛型参数前面加上 out 关键字
  • 无法添加元素,只能读取内容(没有add方法)
  • UnsafeVariance 在协变(Covariance)中的应用主要是用于打破 Kotlin编译器对泛型类型参数使用位置的限制,从而允许将协变类型参数(out T)用在一些原本不允许的位置(如函数参数、可变属性等),前提是开发者自己能保证类型安全。

2. 案例分析:接口类List

前提是List类使用了out关键字定义泛型参数类型;

String是Any的子类,因此List< String >是List< Any >的子类

kotlin 复制代码
        val stringList : List<String> = ArrayList<String>()
        val anyList : List<Any> = stringList
        //假设有add方法
        anyList.add(1) 
        val str: String = anyList.get(0) //出错
        
  • List源码
  • 使用了out关键字声明
  • 没有add方法
  • UnsafeVariance的使用,如何理解大白话讲,比如contains中E被当作输入参数(所谓的逆变点),因此就需要加上该注解
kotlin 复制代码
public interface List<out E> : Collection<E> {
    // Query Operations

    override val size: Int
    override fun isEmpty(): Boolean
    override fun contains(element: @UnsafeVariance E): Boolean
    override fun iterator(): Iterator<E>

    // Bulk Operations
    override fun containsAll(elements: Collection<@UnsafeVariance E>): Boolean

    // Positional Access Operations
    /**
     * Returns the element at the specified index in the list.
     */
    public operator fun get(index: Int): E

    // Search Operations
    /**
     * Returns the index of the first occurrence of the specified element in the list, or -1 if the specified
     * element is not contained in the list.
     */
    public fun indexOf(element: @UnsafeVariance E): Int

    /**
     * Returns the index of the last occurrence of the specified element in the list, or -1 if the specified
     * element is not contained in the list.
     */
    public fun lastIndexOf(element: @UnsafeVariance E): Int

    // List Iterators
    /**
     * Returns a list iterator over the elements in this list (in proper sequence).
     */
    public fun listIterator(): ListIterator<E>

    /**
     * Returns a list iterator over the elements in this list (in proper sequence), starting at the specified [index].
     */
    public fun listIterator(index: Int): ListIterator<E>

    // View
    /**
     * Returns a view of the portion of this list between the specified [fromIndex] (inclusive) and [toIndex] (exclusive).
     * The returned list is backed by this list, so non-structural changes in the returned list are reflected in this list, and vice-versa.
     *
     * Structural changes in the base list make the behavior of the view undefined.
     */
    public fun subList(fromIndex: Int, toIndex: Int): List<E>
}

3.3 逆变

4. 星投影

5. 内联实化

相关推荐
白杨尚青1 小时前
C++进阶篇(二):多态——虚函数、重写、虚函数表与三个经典坑(附完整代码仓库)
开发语言·c++·多态·虚函数·重写·动态绑定
alexhilton11 小时前
Room Fts4:全文搜索替代 SQL LIKE
android·kotlin·android jetpack
hai_android17 小时前
把 Android App 打包成系统应用(System App)
android·kotlin·android jetpack
JMchen17 小时前
【Jetpack 内核实战 01】开篇:Jetpack 组件全家桶核心逻辑与专栏完整规划
android·kotlin·android jetpack
骑着蜗牛撵大象32719 小时前
Linux 进程间通信之管道:从 pipe() 的内核语义到 FIFO 落地排错
android·java·linux·系统编程·fifo·管道·进程间通信
WJ.Polar19 小时前
Java封装、继承、多态
java·开发语言
摇滚侠19 小时前
Java 中如何表示负数,有符号和无符号的区别,补码的计算规则,char byte short int long 的范围
java·开发语言
hunterandroid19 小时前
Retrofit 网络请求的异常处理与重试策略实战
android
weixin_3077791320 小时前
C++代码实现MATLAB中的fitrtree函数功能
开发语言·c++·算法·matlab
sejinan20 小时前
极致轻量与秒级起播:NativeWasmTv 开源硬核技术解析与升级版体验
android·开源·webview·tv