我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java泛型使用实例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java泛型使用实例分析

本篇内容主要讲解“Java泛型使用实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java泛型使用实例分析”吧!

1.概述

作为一个面向对象的编程语言,Java可以通过实现一些类,作为我们各种需求的一个模板,方便我们的使用。但有时候,这个类的范围可能比我们想要的范围要大,我们只想限定于满足类的某些对象,那这样的情况下,泛型的概念就被提出来了(非官方解释,方便理解)。

举个例子:比如我们我们生活中的车,它可以作为一个类,但是车其实又有很多种,包括货车,轿车,大巴车等等,而其中的轿车外观差不多,但是又属于不同的品牌,这些品牌有很多不一样的地方,这里我们可以把轿车的品牌看作是泛型(类似于标签)

通过上面的解释,泛型的概念就比较清晰了,就是一种“类型参数”,所谓类型参数可以理解为将类型由原来的具体的类型进行参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

泛型的优点,不仅仅是上面提到的,其还有下面的优点::

类型安全: 提高Java 程序的类型安全(泛型的主要目标)。
通过知道使用泛型定义的变量的类型限制,编译器可以验证类型假设。
消除强制类型转换:消除源代码中的许多强制类型转换。
这使得代码的可读性更高了,并且还减少了错误
上面说到了泛型在类中的使用,其实泛型的使用远不止于此,其还可以在在接口、方法中使用。下面就对这些分别进行介绍

2.泛型类

所谓泛型类就是把当我们在声明类时,类中的有些成员的类型并不是确定,然后我们可以把泛型定义在类上,当使用该类的时候,再把不确定成员的类型明确下来。

语法格式:

【修饰符】 class 类名<类型变量列表>{
    //类体
}

注: <类型变量列表>:可以是一个或多个类型变量,一般都是使用单个的大写字母表示。例如:、<K,V>等。

<类型变量列表>中的类型变量不能用于静态成员上。

泛型类的使用:

使用这种类似于参数化类型的类时,在创建类的对象时候,我们需要注意:

  • 指定类型变量对应的实际类型参数

  • 实际类型参数必须是引用数据类型,不能是基本数据类型

注:指定泛型实参时,必须左右两边一致,不存在多态现象(右边的可以省略不写)

代码示例:

泛型类的声明与使用:

public class Demo1 {    public static void main(String[] args) {        //泛型类的使用(<T>里面只能是引用类型)        Student<Double> student1 = new Student<>("学生1",99.5);        Student<String> student2 = new Student<>("学生2","优秀");        Student<Character> student3 = new Student<>("学生3",'A');        //输出结果        System.out.println(student1);        System.out.println(student2);        System.out.println(student3);    }}//泛型类的声明class Student<T> { //<T>这个就是泛型类的类型参数    private String name;    private T score; //使用泛型,定义分数(分数可能有double类型(99.5)、字符串类型(优秀)、字符类型(‘A')等)    //构造方法    public Student() {    }    public Student(String name, T score) {        this.name = name;        this.score = score;    }    @Override    public String toString() {        return "Student{" +                "name='" + name + '\'' +                ", score=" + score +                '}';    }}

2.1泛型接口

泛型接口和泛型类关系,就像接口和类的关系一样。 这里不多说。

语法格式:

【修饰符】 interface 接口名<类型变量列表>{
     
}

注: <类型变量列表>:可以是一个或多个类型变量,一般都是使用单个的大写字母表示。例如:、<K,V>等。

<类型变量列表>中的类型变量不能用于静态成员上。

2.2泛型接口的使用

使用这种类似于参数化类型的接口时,我们需要注意:

指定类型变量对应的实际类型参数
实际类型参数必须是引用数据类型,不能是基本数据类型
代码示例

 泛型接口的声明与使用:

public class Demo1 {    public static void main(String[] args) {        //泛型类的使用(<T>里面只能是引用类型)        Student<Double> student1 = new Student<>("学生1",99.5);        //使用泛型接口        student1.print("学生1",99.5);    }}//泛型类的声明class Student<T> implements Print<String,T>{ //<T>这个就是泛型类的,后面<String,T>是接口,多个类型变量    private String name;    private T score; //使用泛型    //构造方法    public Student() {    }    public Student(String name, T score) {        this.name = name;        this.score = score;    }    //重写接口的方法    @Override    public void print(String s, T t) {        System.out.println("学生姓名:"+ this.name);        System.out.println("学生成绩:"+ this.score);    }}//泛型接口的声明interface Print <T,V>{    //定义一个打印函数,可以打印学生姓名和成绩    public void print(T t, V v);}

3.类型变量的上限和下限

前面说到,我们可以使用泛型类型参数,这样等我们进行实际使用的时候,我们可以任意使用类型,但如果想只使用某一系列的类型,泛型也是可以实现的。这就是我们说的类型变量的上限和类型变量的下限。下面进行分别介绍。

3.1类型变量的上限

如果泛型类定义了类型变量的上限,那么该泛型类实际的类型只能是该上限类型或者其子类类型。

语法格式:

泛型类和泛型方法的用法是一样的,后面都不再做区分。

<类型变量  extends 上限1 & 上限2> //上限可以有多个

注:如果多个上限中有类有接口,那么只能有一个类,而且必须写在最左边。接口的话,可以多个。
如果在声明<类型变量>时没有指定上限,默认上限是java.lang.Object。

代码示例:

类型变量的上限:

public class Demo2 {    public static void main(String[] args) {        Test<Double> test1 = new Test<>(77.5); //double类//        Test<String> test2 = new Test<String>(); 不是数字类的子类        Test<Integer> test3 = new Test<>(18);        test1.print(77.5);        test3.print(18);    }}class Test<T extends Number >{ //数字类上限,只能使用数字类及其子类    private T num;    public Test() {    }    public Test(T num) {        this.num = num;    }    public void print(T num){ //测试方法        System.out.println(num);    }}

3.2类型变量的下限

如果泛型类定义了类型变量的下限,那么该泛型类实际的类型只能是该下限类型或者其父类类型。

语法格式:

<?  super E > // ? 代表接收E类型或者E的父类型的元素

? 是泛型类中的通配符(下面会讲到,可以先看下面的再回来看这个)

代码示例:

public class Demo5 {    public static void main(String[] args){        C<String> c=new C<>();        c.setT("<? super 下限>");        fun1(c);    }       //测试函数,泛型类使用了下限    public static void fun1(C<? super String> c){      //接受的数据类型只能为String、Object           System.out.println(c.getT()); //输入测试    }}class C<T>{    private T t;    public T getT() {        return t;    }    public void setT(T t) {        this.t = t;    }}

4.泛型方法

鉴于某个方法定义时,想要自己定义类型变量或者在某个静态方法中定义类型变量的需求,JDK还提供了泛型方法的支持。即可以在某个方法定义时,自定以<类型变量>

注:前面说到类和接口上的类型形参是不能用于静态方法

语法格式:

【修饰符】 <类型变量列表> 返回值类型 方法名(【形参列表】)【throws 异常列表】{
    //方法体
}

注:- <类型变量列表>:可以是一个或多个类型变量,一般都是使用单个的大写字母表示。例如: < T >、<K,V>等。
<类型变量>同样也可以指定上限

代码示例:

public class Demo3 {    public static void main(String[] args) {        Test1 test = new Test1(); //创建测试对象        test.print(12); //测试        test.print(12.5); //测试    }}class Test1{    public <T extends Number> void print(T t){ //泛型方法,可以设置上限        System.out.println("这是一个泛型方法,测试类型:" + t);    }}

5.泛型擦除

泛型擦除只是在编译阶段才会有的,在实际运行阶段类型已经确定了,这个时候就没有泛型的概念了(JVM并不知道泛型的存在)。这个从有泛型信息到没有泛型信息的过程称之为“泛型擦除”。

其擦除规则如下:

  • 若泛型类型没有指定具体类型,用Object作为原始类型;

  • 若有限定类型< T exnteds XClass >,使用XClass作为原始类型;

  • 若有多个限定< T exnteds XClass1 & XClass2 >,使用第一个边界类型XClass1作为原始类型;

6.类型通配符

通配符的意思是可以指代很多类型。这个主要使用在当我们在声明方法时,不确定该泛型实际类型的情况。

类型通配符有三种:

  • <?> 任意类型

  • <? extends 上限>

  • <? super E>

下面对这三种通配符分别进行介绍:

<?> 任意类型

当泛型使用这种 类型通配符的时候,表示可以使用任意类型

代码示例:

public class Demo4 {    public static void main(String[] args) {        // 语文老师使用时:        StudentInfo<String> stu1 = new StudentInfo<String>("张三", "良好");        // 数学老师使用时:        StudentInfo<Double> stu2 = new StudentInfo<Double>("张三", 90.5);        // 英语老师使用时:        StudentInfo<Character> stu3 = new StudentInfo<Character>("张三", 'C');        StudentInfo<?>[] arr = new StudentInfo[3]; //使用通配符        arr[0] = stu1;        arr[1] = stu2;        arr[2] = stu3;        StudentInfoPrint.print(arr); //打印输出结果    }}//学生类是一个参数化的泛型类class StudentInfo<T>{    private String name;    private T score;    public StudentInfo() {        super();    }    public StudentInfo(String name, T score) {        super();        this.name = name;        this.score = score;    }    @Override    public String toString() {        return "姓名:" + name + ", 成绩:" + score;    }}//学生信息打印类class StudentInfoPrint {    //泛型方法,使用通配符    public static void print(StudentInfo<?>[] arr) {        for (int i = 0; i < arr.length; i++) {            System.out.println(arr[i]);        }    }}

到此,相信大家对“Java泛型使用实例分析”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java泛型使用实例分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java泛型使用实例分析

本篇内容主要讲解“Java泛型使用实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java泛型使用实例分析”吧!1.概述作为一个面向对象的编程语言,Java可以通过实现一些类,作为我们各种
2023-06-29

Java泛型实例分析

这篇文章主要介绍“Java泛型实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java泛型实例分析”文章能帮助大家解决问题。首先,我们来看看泛型Java的经典用法:import java.ut
2023-06-03

Java泛型使用入门实例分析

本文小编为大家详细介绍“Java泛型使用入门实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java泛型使用入门实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1、什么是泛型?泛型其实就是将类型作为
2023-06-29

Java基础泛型实例分析

这篇“Java基础泛型实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java基础泛型实例分析”文章吧。一、泛型概述:
2023-06-29

PHP中的泛型使用实例分析

这篇文章主要介绍“PHP中的泛型使用实例分析”,在日常操作中,相信很多人在PHP中的泛型使用实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP中的泛型使用实例分析”的疑惑有所帮助!接下来,请跟着小编
2023-06-30

Go泛型应用工厂方法及泛型使用实例分析

本篇内容介绍了“Go泛型应用工厂方法及泛型使用实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!接口实现泛化编程平时我们编写结构体和方法
2023-07-02

Java泛型与包装类实例分析

今天小编给大家分享一下Java泛型与包装类实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、什么是泛型泛型的本质是为
2023-06-29

Java中泛型的示例分析

小编给大家分享一下Java中泛型的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1. 为什么使用泛型早期的Object类型可以接收任意的对象类型,但是在实
2023-06-20

C# 泛型实现的实例分析

这期内容当中小编将会给大家带来有关C# 泛型实现的实例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C# 泛型实现在 .NET 2.0 中,C# 泛型在 IL(中间语言)和 CLR 本身中具有本机支持
2023-06-17

Java中泛型使用实例详解

Java中泛型使用泛型作用:泛型:集合类添加对象不用强转反射机制:将泛型固定的类的所有方法和成员全部显示出来 核心代码:ArrayList ff=new ArrayList();Ls ls1=new Ls("薯片",5f);
2023-05-31

Java中泛型擦除的示例分析

小编给大家分享一下Java中泛型擦除的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.问题引出源码: public static void main(S
2023-05-31

java泛型数组转换类型的示例分析

小编给大家分享一下java泛型数组转换类型的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数据类型。2、浮点类型,用来表示小数的数据
2023-06-14

Java中泛型与通配符的示例分析

这篇文章主要介绍Java中泛型与通配符的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!题外话: 泛型与通配符是Java语法中比较难懂的两个语法,学习泛型和通配符的主要目的是能够看懂源码,实际使用的不多。1.泛
2023-06-29

Go1.18新特性之泛型实例代码分析

本篇内容主要讲解“Go1.18新特性之泛型实例代码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go1.18新特性之泛型实例代码分析”吧!1. 一切从函数的形参和实参说起假设我们有个计算两数
2023-07-05

C#泛型类概念举例分析

这篇文章主要讲解了“C#泛型类概念举例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#泛型类概念举例分析”吧!C# 泛型类封装不是特定于具体数据类型的操作。泛型类最常用于集合,如链接列
2023-06-17

java 泛型的详解及实例

java 泛型的详解及实例Java在1.5版本中增加了泛型,在没有泛型之前,从集合中读取每一个对象都需要进行强转,如果一不小心插入了类型错误的对象,在运行时就会报错,给日常开发带来了很多不必要的麻烦,比如以下代码:public class
2023-05-31

Go1.18中泛型编程的示例分析

小编给大家分享一下Go1.18中泛型编程的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言经过这几年的千呼万唤,简洁的Go语言终于在1.18版本迎来泛型
2023-06-22

java泛型类型的调用和实例化介绍

本篇内容主要讲解“java泛型类型的调用和实例化介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java泛型类型的调用和实例化介绍”吧!1、泛型调用类似于普通方法调用,但你不是把参数传递给方法
2023-06-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录