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泛型内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java的泛型你真的了解吗

    目录 泛型的概述和优势 自定义泛型类 自定义泛型方法 自定义泛型接口 泛型通配符.上下限 总结 泛型的概述和优势 泛型概述 泛型:是JDK5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查. 泛型的格式:<数据类型>; 注意:泛型只能支持引用数据类型. 集合体系的全部接口和实现类都是支持泛型的使用的. 泛型的好处: 统一数据类型. 把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为编译阶段类型就能确定下来. 泛型可以在很多地方进行定义: 类后面 --> 泛

  • Java超详细分析泛型与通配符

    目录 1.泛型 1.1泛型的用法 1.1.1泛型的概念 1.1.2泛型类 1.1.3类型推导 1.2裸类型 1.3擦除机制 1.3.1关于泛型数组 1.3.2泛型的编译与擦除 1.4泛型的上界 1.4.1泛型的上界 1.4.2特殊的泛型上界 1.4.3泛型方法 1.4.4类型推导 2.通配符 2.1通配符的概念 2.2通配符的上界 2.3通配符的下界 题外话: 泛型与通配符是Java语法中比较难懂的两个语法,学习泛型和通配符的主要目的是能够看懂源码,实际使用的不多. 1.泛型 1.1泛型的用法

  • Java 深入浅出讲解泛型与包装类

    目录 1.什么是泛型 2.泛型的语法 3.泛型的上界 4.通配符 (1)通配符的上界 (2)通配符的下界 5.包装类 1.什么是泛型 泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型). 先看以下的例子: 我们以前学过的数组,只能存放指定类型的元素.如:int[] array=new int[10];String[] array=new String[10];而Object类是所有类的父类,那么我们是否可以创建Obj数组呢? class Mya

  • Java十分钟精通泛型的使用与原理

    什么是泛型? 简而言之:<>泛型就是用来约束类.方法.属性上的数据类型,比如 List<Integer> list = new ArrayList<Integer>(); new ArrayList这个集合的元素只能添加Integer类型. 为什么需要泛型? Java推出泛型之前,程序员可以构建一个Object类型的集合,该集合能够存储任何的数据类型,而在使用该 集合的时候,需要程序员明确知道每个元素的具体的类型并向下转型,否则容易引发ClassCastExceptio

  • Java 泛型超详细入门讲解

    目录 1.什么是泛型? 2.泛型是怎么编译的 泛型的编译机制:擦除机制 1.什么是泛型? 泛型其实就是将类型作为参数传递,泛型允许程序员在编写代码时使用一些以后才指定的类型 ,在实例化该类时将想要的类型作为参数传递,来指明这些类型. 为什么要引入泛型? 例如:自己实现一个顺序表 public class MyArrayList { public int[] elem; public int usedSize; public MyArrayList() { this.elem = new int[

  • Java详细分析讲解泛型

    目录 1.泛型概念 2.泛型的使用 2.1泛型类语法 2.2泛型方法语法 2.3泛型接口语法 2.4泛型在main方法中的使用 3.擦除机制 4.泛型的上界 5.通配符 5.1通配符的上界 5.2通配符的下界 6.包装类 6.1装箱和拆箱 1.泛型概念 泛型就是将类型参数化 所谓类型参数化就是将类型定义成参数的形式,然后在使用此类型的时候的时候再传入具体的类型 到这我们可以看出来:泛型在定义的时候是不知道具体类型的,需要在使用的时候传入具体的类型,泛型可以用在类.接口和方法中,这样做的好处是一个

  • 浅谈Java中的桥接方法与泛型的逆变和协变

    目录 1. 泛型的协变 1.1 泛型协变的使用 1.2 泛型协变存在的问题 1.2.1 Java当中桥接方法的来由 1.2.2 为什么泛型协变时,不允许添加元素呢 1.2.3 从Java字节码的角度去看桥接方法 2. 泛型逆变 2.1 泛型逆变的使用 2.2 泛型逆变会有什么问题 3.协变与逆变-PECS原则 泛型的协变和逆变是什么?对应于Java当中,协变对应的就是<? extends XXX>,而逆变对应的就是<? super XXX>. 1. 泛型的协变 1.1 泛型协变的使

  • Java基础泛型详情

    目录 一.泛型 二.泛型类 三.泛型方法 四.泛型接口 五.类型通配符<?> 六.可变参数 一.泛型 概述: 泛型是JDK5中引入的特性,它提供了编译时类型安全检测机制,该机制允许在编译时检测到非法的类型 本质上是参数化类型,也就是说所操作的数据类型被指定为一个参数 参数化类型:就是将类型由原来的具体的类型参数化,然后在使用/调用时传入具体的参数 这种参数类型可以用在类.方法和接口中,分别被称为泛型类.泛型方法.泛型接口 定义格式: 1.<类型>:指定一种类型的格式,这里的类型可以

  • java简明例举讲解泛型

    目录 什么是泛型 泛型类与接口派生子类 泛型通配符 类型擦除 什么是泛型 早期的Object类型可以接收任意的对象类型,但是在实际的使用中, 会有类型转换的问题.也就存在这隐患,所以Java提供了泛型来解决这个安全问题 泛型,即“参数化类型”.一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传 递实参.就是说 , 我们可以将类型向参数一样传递过去 //一个泛型类 //T可以为任意字符,如A,a,B等都可以 public class Demo1<T> { private T num;

  • java之jvm加载器例举

    在java的学习中,对于jvm模块我们会不断补充一些知识点,毕竟jvm是比较重要的一个组成部分.本篇围绕jvm加载器展开介绍,在加载类的时候,我们的加载器会逐个进行工作,在具体的加载器类型上,想必大家还不是很清楚.下面我们就java之jvm加载器的4中类型带来介绍. 1.Bootstrap ClassLoader (引导类加载器) 负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现的核心库,也就是JVM调用每个系统的API实现系统功能,实现跨平台的主要模块

  • Java中的纸老虎之泛型

    目录 一. 泛型的定义 二. 为什么要用到泛型 三. 泛型的写法 四. 泛型的使用实例 1. 求最大值 2. 优化 五. 通配符 1. 基本写法 2. 上界 3. 下界 六. 泛型的限制 泛型,其实算是Java当中比较难的语法了,很多人一开始都对其一知半解,也很害怕阅读带泛型的源码,虽然看起来语法很难,但当你理解后会觉得很简单,其实只是一个纸老虎罢了.下面,我将会用非常简单易懂的方式带你去理解它,相信你在认真看完后会有非常大的收获,从此不会再畏惧它! 一. 泛型的定义 这里大家可以不必去看网上的

  • Java集合框架入门之泛型和包装类

    目录 1. 预备知识-泛型(Generic) 1.1 泛型的引入 1.2 泛型的分类 1.3 泛型类的定义 1.4 泛型编译的机制 2. 预备知识-包装类(Wrapper Class) 2.1 基本数据类型和包装类的对应关系 2.2 包装类介绍 2.3 装箱(boxing)和拆箱(unboxing) 2.4 自动装箱(autoboxing)和自动拆箱(autounboxing) 2.5 包装类面试题 前言: 本章主要是为了后面学习集合框架所做的知识补充.补充了泛型以及包装类两个知识,但是该章泛型

  • Java简明解读代码块的应用

    目录 什么是代码块 代码块的分类 普通代码块 构造块(实例代码块) 静态代码块 代码块的一些特性 什么是代码块 java中被 {} 括起来的代码这部分被称为代码块 代码块的分类 普通代码块(本地代码块)构造块(实例代码块)静态块同步代码块 本片文章就先讲普通代码块,构造快和静态块.而同步代码块一般在多线程种用到,后面写到多线程的时候会说同步代码块,在这就不多说了.代码块还是很简答的,但是有一些要注意的点希望大家记住,接下来我会通过普通代码块,构造快和静态块一起对比来讲解. 普通代码块 普通代码块

  • Java超详细透彻讲解static

    目录 1. 引入 2. 理解 3. 使用 3.1 使用范围 3.2 static修饰属性 3.2.1 设计思想 3.2.2 分类 3.2.3 注意 3.2.4 举例 3.2.5 类变量内存解析 3.3 static修饰方法 3.3.1 设计思想 3.3.2 理解 3.3.3 使用 3.3.4 注意 3.3.5 举例 4. 注意 5. 单例 (Singleton)设计模式 5.1 概述 5.2 优点 5.3 单例设计模式-饿汉式 5.4 单例设计模式-懒汉式 5.5 应用场景 1. 引入 当我们编

  • C++ primer超详细讲解泛型算法

    目录 初识泛型算法 只读算法 写容器算法 定制操作 lambda表达式 lambda捕获和返回 再探迭代器 插入迭代器 iostream迭代器 反向迭代器 初识泛型算法 只读算法 只读取输入范围内的函数,不改变元素,find,accumula也是如此 (1)accumulate算法为求和算法,前两个参数指出求和元素范围,第三个是和的初值,例: int sum=accumulate(v.begin(),v.end(),0) (2)操作两个序列的算法 equal算法,确定两个序列是否保存相同的值,将

  • C++超详细讲解泛型

    目录 1.了解泛型编程 2.函数模板 2.1简单示例 2.2多个模板参数 2.3模板实例化 2.4模板和普通函数同时存在 2.5函数模板不支持定义和声明分离 3.类模板 3.1简单示例 3.2成员函数声明和定义分离 1.了解泛型编程 就好比活字印刷术,可以灵活调整印刷的板块和内容,比只能固定印刷某一个内容的雕版印刷术效率更高,也让印刷术由此得到了更广泛的应用. 在C++中,函数重载和模板的出现,让泛型编程得到了实际的应用.其中模板,就是类似活字印刷术一样的存在. 2.函数模板 八八了那么多没用的

随机推荐