Kotlin-不变型、协变、逆变
本文最后更新于 665 天前
1. 子类型

任何时候,如果要使用 类型A 的值,都能用 类型B 的值作为替换(当做 A 的值),称 B 是 A 的子类型。

2. 泛型中的子类型

如果List要成为List的子类就必须满足下面两个条件:
1. List中方法接收参数的范围 不得小于 List的方法
2. List中方法返回值的范围 不得大于 List的方法

// List带泛型的定义
public interface List<E> extends Collection<E> {
    boolean add(E e);
    E get(int index);
}

// List<String>定义如下:
public interface List<String> extends Collection<String> {
    boolean add(String e);
    String get(int index);
}

// List<CharSequence>定义如下:
public interface List<CharSequence> extends Collection<String> {
    boolean add(CharSequence e);
    CharSequence get(int index);
}

虽然String get(int index);返回值的范围比CharSequence get(int index);小,满足了第二个条件。
但boolean add(String e);接收参数的范围明显比boolean add(CharSequence e);要小,不满足第一个条件。不变型
所以List不是List的子类型

不变型:Type1是Type2的子类,如果A和A不存在父子关系,则称 类A 在类型参数上是不变型的

协变: 当类型参数变得更具体时,类也变得更具体。当类型参数变得更抽象时,类也变得更抽象
即将上述的add/set方法屏蔽 只能get/取返回值,kotlin使用out关键词 class MyList<out T>{ ... }

逆变: 当类型参数变得更具体时,类却变得更抽象。当类型参数变得更抽象时,类却变得更具体
即将上述的get/取返回值屏蔽,保留add/set方法,kotlin使用in关键词 class MyList<in T>{ ... }

Java成为PECS原则,协变:<? extends T>, 逆变:<? super T>
kotlin则POCI原则

3. 投影
投影类型 投影实例 变型 继承关系 限制
out投影 Group< out Animal > 协变 Group< Dog > 是 Group< out Animal > 子类类型参数不能作为方法参数
in投影 Group< in Animal > 逆变 Group< in Animal > 是 Group< Dog > 子类类型参数不能作为方法返回值
star投影 Group< * > Group<任何类型 > 都是 Group< * > 子类类型参数不能做方法参数也不能做返回值
iichen:https://iichen.cn/?p=397
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇