广告
返回顶部
首页 > 资讯 > 后端开发 > Python >详细全面解析Java泛型
  • 424
分享到

详细全面解析Java泛型

2024-04-02 19:04:59 424人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

1.概述 作为一个面向对象的编程语言,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]);
        }
    }
}

<? extends 上限>

? 代表接收E类型或者E的子类型的元素

代码示例

可参考上面的类型变量的上限代码

<? super E>

? 代表接收E类型或者E的父类型的元素

代码示例

可参考上面的类型变量的下限代码

到此这篇关于详细全面解析Java泛型的文章就介绍到这了,更多相关Java泛型内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详细全面解析Java泛型

本文链接: https://www.lsjlt.com/news/138222.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 详细全面解析Java泛型
    1.概述 作为一个面向对象的编程语言,Java可以通过实现一些类,作为我们各种需求的一个模板,方便我们的使用。但有时候,这个类的范围可能比我们想要的范围要大,我们只想限定于满足类的某...
    99+
    2022-11-13
  • Java 泛型详解(超详细的java泛型方法解析)
    目录2. 什么是泛型3. 使用泛型的好处4. 泛型的使用4.1 泛型类4.2 泛型方法4.3 泛型接口5. 泛型通配符5.1 通配符基本使用5.2 通配符高级使用6. 总结1. 为什...
    99+
    2022-11-12
  • Java详细分析讲解泛型
    目录1.泛型概念2.泛型的使用2.1泛型类语法2.2泛型方法语法2.3泛型接口语法2.4泛型在main方法中的使用3.擦除机制4.泛型的上界5.通配符5.1通配符的上界5.2通配符的...
    99+
    2022-11-13
  • Java 泛型考古 泛型擦除 包装类详细解析
    目录一. 什么是泛型二. 为什么要有泛型 ?示例三、泛型考古四、泛型擦除五、包装类六、装箱拆箱一. 什么是泛型 泛型(generic type)其本质是将类型参数化,也就是说所操作的...
    99+
    2022-11-13
  • Java泛型与注解全面分析讲解
    目录1.什么是泛型2.为何使用泛型2.1.如何定义泛型2.2.通配符2.3.受限泛型2.4.泛型接口2.5.泛型方法3.java高级--注解3.1.预定义注解3.2.自定义注解(初级...
    99+
    2022-11-13
  • java泛型详细介绍
    一. 泛型概念的提出(为什么需要泛型)?(推荐:java视频教程)首先,我们看下下面这段简短的代码:public class GenericTest { public static void main(String[] args)...
    99+
    2019-06-24
    java基础 java
  • Java 泛型超详细入门讲解
    目录1、什么是泛型2、泛型是怎么编译的泛型的编译机制:擦除机制1、什么是泛型 泛型其实就是将类型作为参数传递,泛型允许程序员在编写代码时使用一些以后才指定的类型 ,在实例化该类时将想...
    99+
    2022-11-13
  • 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...
    99+
    2022-11-13
  • React props全面详细解析
    目录一、Props 是什么二、props children模式1. props 插槽组件2. render props模式3. render props模式三、进阶实践一、Props...
    99+
    2022-11-13
    React props React props的使用
  • Java泛型详解,史上最全图文详解
    泛型在java中有很重要的地位,无论是开源框架还是JDK源码都能看到它。 毫不夸张的说,泛型是通用设计上必不可少的元素,所以真正理解与正确使用泛型,是一门必修课。 一:泛型本质 Java 泛型(generics)是 JDK 5 中引入的一...
    99+
    2023-08-17
    java 开发语言 后端
  • C++超详细讲解泛型
    目录1.了解泛型编程2.函数模板2.1简单示例2.2多个模板参数2.3模板实例化2.4模板和普通函数同时存在2.5函数模板不支持定义和声明分离3.类模板3.1简单示例3.2成员函数声...
    99+
    2022-11-13
  • Java泛型的解析
    这期内容当中小编将会给大家带来有关Java泛型的解析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、泛型简介1.1 泛型的概念 所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是...
    99+
    2023-06-15
  • 关于java泛型的详细介绍
    Java泛型泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。 比如我们要写一个排序方法,能够对整型数组、字符串数组甚至其他任何类型的数组进行排序,...
    99+
    2021-04-27
    java入门 java 泛型
  • Java 中的泛型(两万字超全详解)
    文章目录 前言一、泛型概述1. 什么是泛型?为什么要使用泛型?2. 泛型使用场景3. 泛型概述小结 二、泛型类1. 泛型类的定义2. 泛型类的使用 三、泛型接口四、泛型方法1. 泛型方法的定义2. 泛型方法的使用3. 泛型方...
    99+
    2023-08-16
    java 泛型
  • 详解Java中的泛型
    目录一.什么是泛型二.泛型类的使用2.1泛型类的定义2.2泛型类的数组使用三.泛型的上界四.泛型的方法五.泛型与集合一.什么是泛型 当我们不确定数据类型时,我们可以暂时使用一个字母 ...
    99+
    2023-05-19
    Java泛型 Java泛型类
  • Java 泛型详解与范例
    目录一、泛型的使用二、泛型类的定义-类型边界三、类型擦除四、泛型类的使用-通配符五、泛型方法六、泛型的限制一、泛型的使用 前面我们学集合的时候,简单的说过泛型的使用。如下: Ar...
    99+
    2022-11-12
  • C++primer超详细讲解泛型算法
    目录初识泛型算法只读算法写容器算法定制操作lambda表达式lambda捕获和返回再探迭代器插入迭代器iostream迭代器反向迭代器初识泛型算法 只读算法 只读取输入范围内的函数,...
    99+
    2022-11-13
  • TypeScript中泛型的使用详细讲解
    目录一、泛型程序设计是一种编程风格或编程范式二、案例:传入的参数类型与返回的类型一样三、形式类型参数四、泛型约束五、泛型函数六、泛型函数类型推断补充:应用场景总结一、泛型程序设计是一...
    99+
    2022-11-13
    typescript泛型使用 ts 泛型
  • Java泛型枚举Annotation接口详细解读与Eclipse发展
    目录1、Eclipse开发工具1.1 Eclipse历史1.2 快捷键1.3 Debug调试1.4 JUNIT测试工具2、Java基础新特性2.1 可变参数2.2 foreach输出...
    99+
    2022-11-12
  • Java的类型擦除式泛型详解
    Java选择的泛型类型叫做类型擦除式泛型。什么是类型擦除式泛型呢?就是Java语言中的泛型只存在于程序源码之中,在编译后的字节码文件里,则全部泛型都会被替换为原来的原始类型(Raw...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作