java简明例举讲解泛型

 更新时间:2022年04月27日 09:18:07   作者:羡羡ˇ  
这篇文章主要介绍了Java的泛型,针对利用继承来实现通用程序设计所产生的问题,泛型提供了更好的解决方案,需要的朋友可以参考一下

什么是泛型

       早期的Object类型可以接收任意的对象类型,但是在实际的使用中, 会有类型转换的问题。也就存在这隐患,所以Java提供了泛型来解决这个安全问题

      泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传

递实参。就是说 , 我们可以将类型向参数一样传递过去  

//一个泛型类
//T可以为任意字符,如A,a,B等都可以
public class Demo1<T> { 
    private T num;
    public Demo1() {}
    public Demo1(T num) {
        this.num = num;
    }
    public void setNum(T num) {
        this.num = num;
    }
    public static void main(String[] args) {
        Demo1<Integer> demo1 = new Demo1<>(101);
    }
}

      如上 , 实际传入时需指明传入的实际类型 , 此处为Integer(泛型不能为int等基本类型,只能为引用类型) , 如果不指明则默认为object型

      当然也可以定义多个泛型

public class Demo1<T,A> { } 

泛型类与接口派生子类

       此处我们定义一个Demo2类继承上面的Demo1 类

可以看到 ,这样显然是不行的 , 那么此处有两种解决办法

1. 指明父类泛型的具体类型 ,如 : 

public class Demo2 extends Demo1<Integer>{
}

2. 子类也是泛型类, 如 :

public class Demo2<T> extends Demo1<T>{
}

子类也是泛型类,子类和父类的泛型类型要一致

子类不是泛型类,父类要明确泛型的数据类型

泛型接口与泛型类的定义及使用基本相同。

泛型通配符

相信很多人都见过这种写法

 ? 是什么意思呢  , 接着我们来解释

 ? 代表类型通配符 , 代表传入实参时 , 可以传入为任意类型 

例如, 上述demo1 中 new对象也可以这样写 

Demo1<?> demo1 = new Demo1<>(101);

       ? 只能代表传入的具体实参 , 类上面的是形参,所以?只能具体传入时使用, ? 表示实际传入的参数类型可以是任意的

类型通配符上限 :

 类/接口<?extends 实参类型>

// ? extends Number
public static void method(Demo1<? extends Number> demo1){
}
public static void main(String[] args) {
   method(new Demo1<Integer>());
}

       如上 , 我们在method() 中传入的参数是上述定义的Demo1类类型 ,  ? extends Number的意思就是说我们实际传入的类型上限是 Number , 也就是说, 只有Number 和 Number的子类(此处传入为Integer , Number是Integer的父类)被实际传入才是合法的

类型通配符下限 :

类/ 接口 < ? super 实参类型 >    

了解了上限 , 那么下限这里也就不难理解了 , 就是传入的必须是 自己或者自己的父类

public static void method1(Demo1<? super Number> demo1){
}
public static void main(String[] args) {
    method1(new Demo1<Object>());
}

此处必须传入Number 或者 Number的父类 (此处传入为Object类)

类型擦除

        泛型是Java 1.5版本才引进的概念,在这之前是没有泛型的,但是,泛型代码能够很 好地和之前版本的代码兼容。那是因为,泛到信息只存在于代码编译阶段,在进入JVM之前,与泛型相关的信息会被擦除掉,我们称之为一类型擦除. 泛型类被类型擦除后,相应的类型就被替换成 Object 类型或者上限类型.

       就是说 , 泛型只存在于编译期期间 , 真正执行代码的时候 , 是没有泛型这个概念的, 它只是在编译期对我们传入的类型做了约束

到此这篇关于java简明例举讲解泛型的文章就介绍到这了,更多相关java泛型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java实现RedisTemplate操作哈希数据

    java实现RedisTemplate操作哈希数据

    RedisTemplate是Spring Data Redis提供的一个用于操作Redis的模板类,本文主要介绍了java实现RedisTemplate操作哈希数据,具有一定的参考价值,感兴趣的可以了解一下
    2024-09-09
  • Spring源码解析之Bean的生命周期

    Spring源码解析之Bean的生命周期

    今天给大家带来的是关于Java源码的相关知识,文章围绕着Bean的生命周期展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • 一文详解Java中的原子操作

    一文详解Java中的原子操作

    在Java中,原子操作尤为重要,尤其是在多线程环境中,想象一下,如果小黑在操作一个共享变量时,这个操作被其他线程打断,那会发生什么?可能会导致数据不一致,或者更糟糕的情况,本文将给大家详细介绍一下Java中的原子操作
    2024-01-01
  • Maven 打包项目到私服 (deploy)的配置方法

    Maven 打包项目到私服 (deploy)的配置方法

    这篇文章主要介绍了Maven 打包项目到私服 (deploy)的配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • java语言描述Redis分布式锁的正确实现方式

    java语言描述Redis分布式锁的正确实现方式

    这篇文章主要介绍了java语言描述Redis分布式锁的正确实现方式,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • 超细讲解Java调用python文件的几种方式

    超细讲解Java调用python文件的几种方式

    有时候我们在写java的时候需要调用python文件,下面这篇文章主要给大家介绍了关于Java调用python文件的几种方式,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • Spring测试基本的控制器实战示例

    Spring测试基本的控制器实战示例

    这篇文章主要为大家介绍了Spring测试基本的控制器实战示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Java实现优雅停止线程的有效方法详解

    Java实现优雅停止线程的有效方法详解

    这篇文章主要为大家详细如何安全有效停止 Java 线程的,确保多线程应用程序平稳运行并实现最佳资源管理,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • mybatis分割字符串并循环,实现in多个参数的操作

    mybatis分割字符串并循环,实现in多个参数的操作

    这篇文章主要介绍了mybatis分割字符串并循环,实现in多个参数的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • struts中动态方法调用使用通配符

    struts中动态方法调用使用通配符

    这篇文章主要介绍了struts中动态方法调用使用通配符的相关资料,非常不错,具有参考借鉴价值,感兴趣的朋友一起看看吧
    2016-09-09

最新评论