泛型通配符

  • <? extends T>:是指 “上界通配符(Upper Bounds Wildcards)”

Plate<? extends Fruit> p=new Plate<Apple>(new Apple());

  • <? super T>:是指 “下界通配符(Lower Bounds Wildcards)”

Plate<? super Fruit> p=new Plate<Fruit>(new Fruit());
泛型 - 图1
泛型 - 图2

PECS(Producer Extends Consumer Super)原则:

  • 频繁往外读取内容的,适合用上界Extends。
  • 经常往里插入的,适合用下界Super。

**

Practice

**Test1 - 代码减肥
借助? extends, 把代码减肥到只是用一种方法

  1. package generic;
  2. import java.util.ArrayList;
  3. import charactor.ADHero;
  4. import charactor.APHero;
  5. import charactor.Hero;
  6. public class TestGeneric {
  7. public static void iterate(ArrayList<Hero> list) {
  8. for (Hero hero : list) {
  9. System.out.println(hero.name);
  10. }
  11. }
  12. public static void iterateAP(ArrayList<APHero> list) {
  13. for (Hero hero : list) {
  14. System.out.println(hero.name);
  15. }
  16. }
  17. public static void iterateAD(ArrayList<ADHero> list) {
  18. for (Hero hero : list) {
  19. System.out.println(hero.name);
  20. }
  21. }
  22. public static void main(String[] args) {
  23. ArrayList<Hero> hs = new ArrayList<>();
  24. ArrayList<APHero> aphs = new ArrayList<>();
  25. ArrayList<ADHero> adhs = new ArrayList<>();
  26. iterate(hs);
  27. iterateAP(aphs);
  28. iterateAD(adhs);
  29. }
  30. }

Ans:

  1. package generic;
  2. import java.util.ArrayList;
  3. import charactor.ADHero;
  4. import charactor.APHero;
  5. import charactor.Hero;
  6. public class TestGeneric {
  7. public static void iterate(ArrayList<? extends Hero> list) {
  8. for (Hero hero : list) {
  9. System.out.println(hero.name);
  10. }
  11. }
  12. public static void main(String[] args) {
  13. ArrayList<Hero> hs = new ArrayList<>();
  14. ArrayList<APHero> aphs = new ArrayList<>();
  15. ArrayList<ADHero> adhs = new ArrayList<>();
  16. iterate(hs);
  17. iterate(aphs);
  18. iterate(adhs);
  19. }
  20. }