点击领取优惠~
402 字
2 分钟
协变和逆变(out和in)
协变与逆变是数学中的概率,协变就是x跟y正相关图形是往上的,逆变就是x跟y负相关图形是往下的。
- 协变往上的肯定有个最大的上限,java中的上限就是obj,所以你会看到很多这样的代码out Any或者?extentd Object
- 逆变往下的肯定有个最小值,所以你会看到很多这样的代码out T或者? super T
这里面还会涉及到一个set和get的问题,协变只能get不能set。比如逆变只能set不能get。
这个结论你可以记起来,也可以理解一下,这个是面向对象的基础。举个例子说明 爷爷辈(会玩手机)、爸爸辈(会玩手机会上网)、孙子辈(会玩手机会上网会打游戏)。 比如指定的上限(out、extends)是爷爷辈,如果只是作为返回值,直接返回T就可以,因为不管你返回什么类型,最后都可以用爷爷辈来接。而如果用于set,你可以传个爸爸辈或者孙子辈的进来,里面并不知道你确切的类型就出问题了。
反过来,如果逆变(in、super)指定的下限是孙子辈,用于set就可以,因为孙子已经包含了爷爷、爸爸辈的内容了。而返回就不行,因为你外面返回如果用t接,你不知道是孙子辈还是老一辈。如果返回的是老一辈你外面调用用的是孙子辈打游戏就崩了。
协变和逆变(out和in)