• 泛型进阶:通配符


    基本概念 

    对泛型不了解的可以看这篇博客:数据结构前瞻-CSDN博客

    一般来说,?在泛型里的使用就是通配符

    看看下面的代码

    1. class Message {
    2. private T message ;
    3. public T getMessage() {
    4. return message;
    5. }
    6. public void setMessage(T message) {
    7. this.message = message;
    8. }
    9. }
    10. public class Test {
    11. public static void main(String[] args) {
    12. Message message = new Message<>() ;
    13. message.setMessage("比特就业课欢迎您");
    14. fun(message);
    15. }
    16. public static void fun(Message temp){
    17. System.out.println(temp.getMessage());
    18. }
    19. }

    现在我们想让程序打印另一条消息,类型是Integer,这么一搞直接报错了

    因为我们的fun函数已经限定传入的必须是String类型,那我们要打印Integer怎么办呢?

    把String换成?表示程序也不知道要打印哪种类型,那不就可以打印所有类型了吗

    但是这样做就不能在fun里面setMessage了,因为传入的temp也不知道是什么类型


    通配符上界

    语法

    1. extends Number>//可以传入的实参类型是Number或者Number的子类

    例子

    定义盘子泛型,可以放入Apple和Banana等水果

    1. class Plate { // 设置泛型
    2. private T message ;
    3. public T getMessage() {
    4. return message;
    5. }
    6. public void setMessage(T message) {
    7. this.message = message;
    8. }
    9. }

     定义通配符上界

    1. public static void fun(Plate temp){
    2. Fruit fruit = temp.getMessage();//向上转型
    3. System.out.println(fruit);
    4. }
    1. public static void main(String[] args) {
    2. Plate plate = new Plate<>();
    3. Plate plate1 = new Plate<>();
    4. fun(plate);
    5. fun(plate1);
    6. }

    通配符下界

    1. super 下界>
    2. super Integer>//代表 可以传入的实参的类型是Integer或者Integer的父类类型

     

    为什么这里会报错呢?

    因为temp.getMessage()拿到的是Fruit的父类Food,跟前面的Fruit类型不匹配?

    不匹配就强制让它匹配,强转一下就可以运行了

    Fruit fruit = (Fruit) temp.getMessage();

  • 相关阅读:
    【深度学习】不同虚拟环境安装不同Pytorch版本
    HDFS集群压测介绍-尚硅谷大数据培训
    [Qt网络编程]之UDP通讯的简单编程实现
    RetentionPolicy枚举类
    【splishsplash】PBD探究
    Kubernetes 核心对象概览详解
    华为数据库工程师面试题目
    响应式编程-基本介绍
    [nlp] grad norm先降后升再降
    mysql group_concat 与 union 联合查询漏洞,数据列最大长度为341
  • 原文地址:https://blog.csdn.net/hellg/article/details/134513108