1. 程式人生 > >Java泛型中的協變和逆變

Java泛型中的協變和逆變

之間 不支持 log csdn array java new 通配 逆變

Java泛型中的協變和逆變

一般我們看Java泛型好像是不支持協變或逆變的,比如前面提到的List<Object>List<String>之間是不可變的。但當我們在Java泛型中引入通配符這個概念的時候,Java 其實是支持協變和逆變的。

看下面幾行代碼:


  1. // 不可變
  2. List<Fruit>fruits =newArrayList<Apple>();// 編譯不通過
  3. // 協變
  4. List<?extendsFruit>wildcardFruits =newArrayList<Apple>();
  5. // 協變->方法的返回值,對返回類型是協變的:Fruit->Apple
  6. Fruitfruit =wildcardFruits.get(0);
  7. // 不可變
  8. List<Apple>apples =newArrayList<Fruit>();// 編譯不通過
  9. // 逆變
  10. List<?superApple>wildcardApples =newArrayList<Fruit>();
  11. // 逆變->方法的參數,對輸入類型是逆變的:Apple->Fruit
  12. wildcardApples.add(newApple());

可見在Java泛型中通過extends關鍵字可以提供協變的泛型類型轉換,通過supper可以提供逆變的泛型類型轉換。

--------------------- 本文來自 OkidoGreen 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/z69183787/article/details/51598355?utm_source=copy

Java泛型中的協變和逆變