Java泛型中的協變和逆變
阿新 • • 發佈:2018-10-09
之間 不支持 log csdn array java new 通配 逆變
Java泛型中的協變和逆變
一般我們看Java泛型好像是不支持協變或逆變的,比如前面提到的List<Object>
和List<String>
之間是不可變的。但當我們在Java泛型中引入通配符這個概念的時候,Java 其實是支持協變和逆變的。
看下面幾行代碼:
// 不可變
List<Fruit>fruits =newArrayList<Apple>();// 編譯不通過
// 協變
List<?extendsFruit>wildcardFruits =newArrayList<Apple>();
// 協變->方法的返回值,對返回類型是協變的:Fruit->Apple
Fruitfruit =wildcardFruits.get(0);
// 不可變
List<Apple>apples =newArrayList<Fruit>();// 編譯不通過
// 逆變
List<?superApple>wildcardApples =newArrayList<Fruit>();
// 逆變->方法的參數,對輸入類型是逆變的:Apple->Fruit
wildcardApples.add(newApple());
可見在Java泛型中通過extends
關鍵字可以提供協變的泛型類型轉換,通過supper
可以提供逆變的泛型類型轉換。
--------------------- 本文來自 OkidoGreen 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/z69183787/article/details/51598355?utm_source=copy
Java泛型中的協變和逆變