让开发
成为一种享受!

Java泛型之? super T 和 ? extends T

作为Java开发者,大家应该都有使用泛型的经历,平时应该也会看到类似<? super T> 和 <? extends T>这样的泛型定义,那这两种定义方式到底表示什么意思呢 ?

一、定义阐述

  • <? super T>:表示泛型的目标类型?是T及T的父类
  • <? extends T>:表示泛型的目标类型?是T及T的子类

请默念三遍定义(重要的东西读三遍)

二、举栗说明

2.1 类图

image-20200626175147083

2.2 具体类

public interface Fly {
   void fly();
}

public interface Recipes {
   void recipes();
}

/**
* 海鸥
*/
public class Seagull implements Fly, Recipes {
   private String name;

   public Seagull(String name) {
       this.name = name;
  }

   @Override
   public void fly() {
       System.out.println("我是" + this.name + ", 我会飞");
  }

   @Override
   public void recipes() {
       System.out.println("我吃鱼");
  }
}

/**
* 麻雀
*/
public class Sparrow implements Fly {
   private String name;

   public Sparrow(String name) {
       this.name = name;
  }

   @Override
   public void fly() {
       System.out.println("我是" + this.name + ", 我会飞");
  }
}

/**
* 南方麻雀
*/
public class NorthSparrow extends Sparrow {
   private String name;
   public NorthSparrow(String name) {
       super(name);
       this.name = name;
  }
   public void from() {
       System.out.println("我是来自南方的" + this.name);
  }
}

2.3 测试类

public class Action {
   public static void flyAction(List<? extends Fly> list) {
       list.forEach(Fly::fly);
  }

   public static void seagullAction(List<? super Seagull> list) {
       list.forEach(it -> {
           if (it instanceof Seagull) {
              ((Seagull) it).fly();
              ((Seagull) it).recipes();
          } else if (it instanceof Fly) {
              ((Fly) it).fly();
          } else if (it instanceof Recipes) {
              ((Recipes) it).recipes();
          }
      });
  }

   public static void fromAction(List<? extends Sparrow> list) {
       list.forEach(it -> {
           if (it instanceof NorthSparrow) {
              ((NorthSparrow) it).from();
          }
           it.fly();
      });
  }

   public static void main(String[] args) {
       /* 函数flyAction接受集合List<Fly>、List<Seagull>、List<Sparrow> */
       List<Fly> list1 = Arrays.asList(new Seagull("海鸥1"), new Sparrow("燕子1"));
       flyAction(list1);
       List<Seagull> list2 = Arrays.asList(new Seagull("海鸥2"), new Seagull("海鸥3"));
       flyAction(list2);
       List<Sparrow> list3 = Arrays.asList(new Sparrow("燕子2"), new Sparrow("燕子3"));
       flyAction(list3);

       /* 函数seagullAction接受集合List<Seagull>、List<Fly>、List<Recipes> */
       List<Seagull> list4 = Arrays.asList(new Seagull("海鸥4"), new Seagull("海鸥5"));
       seagullAction(list4);
       List<Fly> list5 = Arrays.asList(new Seagull("海鸥6"), new Seagull("海鸥7"));
       seagullAction(list5);
       List<Recipes> list6 = Arrays.asList(new Seagull("海鸥8"), new Seagull("海鸥9"));
       seagullAction(list6);

       /* 函数fromAction接受集合List<Sparrow>、List<NorthSparrow> */
       List<Sparrow> list7 = Arrays.asList(new Sparrow("燕子4"), new NorthSparrow("燕子5"));
       fromAction(list7);
       List<NorthSparrow> list8 = Arrays.asList(new NorthSparrow("燕子6"), new NorthSparrow("燕子7"));
       fromAction(list8);
  }
}

如果不懂请再读三遍定义,如果还是不懂,请转行。T.T

扫码关注公众号:Java开发乐园

在聊天窗口回复:vip

输入验证码,即可永久解锁本站全部文章

扫码关注【Java开发乐园】

Java开发乐园

扫码关注【东方】

微信:东方

验证码:
赞(0) 打赏
转载请注明出处:Java开发乐园 » Java泛型之? super T 和 ? extends T

来评论一下嘛~ 抢沙发

评论前必须登录!

 

我愿终生等候,换你刹那凝眸

留点🐾印

打赏即是一种肯定,谢谢您的肯定

支付宝扫一扫打赏

微信扫一扫打赏