Java中泛型的接口、通配符使用详解

 更新时间:2023年08月26日 10:18:52   作者:Mr.乐.  
这篇文章主要介绍了Java中泛型的接口、通配符使用详解,编译时的类型安全监测机制,也可以把这个数据类型理解成是一种可以传递的参数,需要的朋友可以参考下

Java中的泛型

泛型应用类型

泛型定义时常用方式有三种(可参考List<E>,Map<K,V)等接口定义):

  • 泛型类:class 类名<泛型,…>{}
  • 泛型接口:interface 接口名<泛型,…>{}
  • 泛型方法: <泛型> 方法返回值类型 方法名(形参){}

1 -定义

编译时的类型安全监测机制,也可以把这个数据类型理解成是一种可以传递的参数

泛型类、泛型方法、泛型接口

2 - 泛型定义格式

<类型>:表示一种类型的格式

<类型1,类型2......> :表示是多种类型的格式,用逗号分割

class Array<T>{//类泛型:类名<泛型>
  Object[] array=new Object[10];
  public void add(T t){}//通过类泛型约束方法参数类型
  public T get(int i){//通过类泛型约束方法返回值类型
    return (T)array[i];
  }
}

3 - 使用泛型的好处

  • 把运行期间可能出现的问题,拿到编译期间(错误等级的提升)
  • 避免强制类型转换丢失精度等问题的出现

4 - 泛型类

/**
 * @author Mr.乐
 * @Description 泛型类
 * E  -  Element
 * K  -  Key
 * T  -  Type
 * V  -  Value
 */
public class Generic<T> {
//这个成员变量的类型为T,T的类型由外部指定  
    private T t;
    public T getT() {
        return t;
    }
    public void setT(T t) {
        this.t = t;
    }
}
-------------------------------------
/**
 * @author Mr.乐
 * @Description 泛型类测试类
 */
public class Demo01 {
    public static void main(String[] args) {
        Generic<String> strG = new Generic<>();//创建泛型类对象
        strG.setT("我是一个字符串!~");
        System.out.println(strG.getT());
        Generic<Integer> intG = new Generic<>();
        intG.setT(1314);
        System.out.println(intG.getT());
    }
}

5 -泛型方法

/**
 * @author Mr.乐
 * @Description
 */
public class Generic {
    //泛型方法
    /*public <T> void show(T i) {
        System.out.println(i);
    }*/
    //有返回值类型的泛型方法
    public <T> T show(T i) {
        return i;
    }
}
-----------------------------
/**
 * @author Mr.乐
 * @Description
 */
public class Demo02 {
    public static void main(String[] args) {
        Generic g = new Generic();//创建泛型方法类的对象
        System.out.println(g.show(1314));
        g.show("String");
        g.show(3.14f);
        g.show(new Student("Andy",18));
    }
}

6 - 泛型接口

/**
 * @author Mr.乐
 * @Description
 */
public interface Generic <T>{
    void show(T t);
}
----------------------------------
/**
 * @author Mr.乐
 * @Description
 */
public class GenericImpl <T> implements Generic<T>{
    @Override
    public void show(T t) {
        System.out.println("我是实现类中的show方法:" + t);
    }
}
---------------------------------------------------------------------
/**
 * @author Mr.乐
 * @Description
 */
public class Demo03 {
    public static void main(String[] args) {
        GenericImpl<String> strG = new GenericImpl<>();
        strG.show("字符串");
        //通过匿名内部类实现
        new Generic<Integer>() {
            @Override
            public void show(Integer integer) {
                System.out.println("我是匿名内部类的show方法" + integer);
            }
        }.show(1314);
    }
}

7 - 泛型通配符

import java.util.ArrayList;
/**
 * @author Mr.乐
 * @Description  泛型通配符
 */
public class demo04 {
    public static void main(String[] args) {
        //<?>  通配所有  相当于Object
        ArrayList<?> list01 = new ArrayList<Object>();
        ArrayList<?> list02 = new ArrayList<Integer>();//Integer为Object子类
        ArrayList<?> list03 = new ArrayList<Float>();
        ArrayList<?> list04 = new ArrayList<Number>();
        //<? extends Number>  上限  ?仅为Number类及子类
        ArrayList<? extends Number> list05 = new ArrayList<Number>();
        ArrayList<? extends Number> list06 = new ArrayList<Integer>();
        ArrayList<? extends Number> list07 = new ArrayList<Float>();
//        ArrayList<? extends Number> list08 = new ArrayList<String>();
        //<? super Number>   下限   ?仅为Number类及父类
        ArrayList<? super Number> list09 = new ArrayList<Number>();
//        ArrayList<? super Number> list10 = new ArrayList<Integer>();
//        ArrayList<? super Number> list11 = new ArrayList<String>();
        ArrayList<? super Number> list12 = new ArrayList<Object>();
    }
}

8 - 泛型通配符的基本应用

import java.util.ArrayList;
/**
 * @author Mr.乐
 * @Description  泛型通配符的基本应用
 */
public class Demo05 {
    public static void main(String[] args) {
        ArrayList<String> strList = new ArrayList<>();
        show(strList);
//        showUp(strList);
//        showDown(strList);
        ArrayList<Integer> intList = new ArrayList<>();
        show(intList);
        showUp(intList);
//        showDown(intList);
        ArrayList<Number> numList = new ArrayList<>();
        show(numList);
        showUp(numList);
        showDown(numList);
        ArrayList<Object> objList = new ArrayList<>();
        show(objList);
//        showUp(objList);
        showDown(objList);
    }
    //<?>  表示通配所有
    private static void show(ArrayList<?> list){
    }
    //表示上限
    private static void showUp(ArrayList<? extends Number> list){
    }
    //表示下限
    private static void showDown(ArrayList<? super Number> list){
    }
}

总结

泛型,大家用到最多的就是在集合中,在实际的开发过程中,自己可以使用泛型去简化开发,保证同种类型,能很好的保证代码质量。

到此这篇关于Java中泛型的接口、通配符使用详解的文章就介绍到这了,更多相关Java中的泛型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot集成 Prometheus进行高效监控的实现

    SpringBoot集成 Prometheus进行高效监控的实现

    Prometheus作为一个开源的监控和告警工具,以其强大的数据采集、存储和查询能力,受到了众多开发者的青睐,本文主要介绍了SpringBoot集成 Prometheus进行高效监控的实现,感兴趣的可以了解一下
    2024-07-07
  • 详解mybatis中association和collection的column传入多个参数问题

    详解mybatis中association和collection的column传入多个参数问题

    这篇文章主要介绍了详解mybatis中association和collection的column传入多个参数问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • jdbc结合dpcp连接池的封装实例

    jdbc结合dpcp连接池的封装实例

    下面小编就为大家带来一篇jdbc结合dpcp连接池的封装实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Spring Boot ActiveMQ发布/订阅消息模式原理解析

    Spring Boot ActiveMQ发布/订阅消息模式原理解析

    这篇文章主要介绍了Spring Boot ActiveMQ发布/订阅消息模式原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Nett中的心跳机制与断线重连详解

    Nett中的心跳机制与断线重连详解

    这篇文章主要介绍了Nett中的心跳机制与断线重连详解,我们以客户端发送心跳为例,平时我们的心跳实现方式可能是搞个定时器,定时发送是吧,但是在Netty中却不一样,心跳被称为空闲检测,需要的朋友可以参考下
    2023-12-12
  • JAVA SE包装类和泛型详细介绍及说明方法

    JAVA SE包装类和泛型详细介绍及说明方法

    这篇文章主要介绍了JAVA SE包装类和泛型的相关资料,包括基本数据类型与包装类的对应关系,以及装箱和拆箱的概念,并重点讲解了自动装箱和自动拆箱的机制,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-03-03
  • 解决spring项目找不到Aspect依赖注解的问题

    解决spring项目找不到Aspect依赖注解的问题

    这篇文章主要介绍了解决spring项目找不到Aspect依赖注解的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 如何用Java来进行文件切割和简单的内容过滤的实现

    如何用Java来进行文件切割和简单的内容过滤的实现

    这篇文章主要介绍了如何用Java来进行文件切割和简单的内容过滤的实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-01-01
  • Flink入门级应用域名处理示例

    Flink入门级应用域名处理示例

    这篇文章主要介绍了一个比较简单的入门级Flink应用,代码很容易写,主要用到的算子有FlatMap、KeyBy、Reduce,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • Java网络编程之UDP实现原理解析

    Java网络编程之UDP实现原理解析

    UDP实现通信非常简单,没有服务器,每个都是客户端,每个客户端都需要一个发送端口和一个接收端口,本文给大家介绍Java网络编程之UDP实现原理解析,感兴趣的朋友一起看看吧
    2021-09-09

最新评论