Java 泛型的介绍和使用

news2024/11/29 1:43:59

什么是泛型?

1.数据类型变得广泛,或者是数据类型变量化,这就是泛型.(广泛的类型).

2.有一个变量是用来存放一个数据类型,这就叫做泛型.

比如泛型T存放的是一个int 就表示为:T=int

当然T也可以是其他的数据类型,就取决我们给它数据类型.

3.泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型。

泛型的作用

1.对集合的数据类型进行约束.

如下程序


import java.lang.reflect.Array;
import java.security.cert.CollectionCertStoreParameters;
import java.util.*;

public class Main {
    public static void main(String[] args) {

//        定义集合
        ArrayList<Person> people = new ArrayList<>();

//        添加数据
        people.add(new Person("Doch",23));

//        试图添加一个不是人的数据类型.
        people.add(new Cat("stanc",22));
        

    }
}

class Person{
    private  String name;
    private  int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return this.name+"\t"+this.age;
    }

}

class Cat{
    private String name;
    private  int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return this.name+"\t"+this.age;
    }
}

运行出错

这样就成功的限制了数据类型.

改进后


import java.lang.reflect.Array;
import java.security.cert.CollectionCertStoreParameters;
import java.util.*;

public class Main {
    public static void main(String[] args) {

//        定义集合
        ArrayList<Person> people = new ArrayList<>();

//        添加数据
        people.add(new Person("Doch",23));

//        遍历arraylist,限制了数据类型后,可以直接定义Person类型来遍历数据了.
        for(Person p :people)
        {
            System.out.println(p);
        }

    }
}

class Person{
    private  String name;
    private  int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return this.name+"\t"+this.age;
    }

}

class Cat{
    private String name;
    private  int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return this.name+"\t"+this.age;
    }
}

2.提高集合的效率.

当我们指定了集合的数据类型,在使用集合的时候就不会出现了Object类型的转换.因为数据类型已经指定了.

就比如在遍历的时候.

//没有泛型

//在输出的时候会隐藏式将Object数据类型转换成Person然后再输出。
        for(Object p :people)
        {
            System.out.println(p);
        }

有泛型

//        遍历arraylist,限制了数据类型后,可以直接定义Person类型来遍历数据了.
//        因此在遍历输出的时候就直接输出了,没必要进行数据转换。
        for(Person p :people)
        {
            System.out.println(p);
        }

例子


import java.lang.reflect.Array;
import java.security.cert.CollectionCertStoreParameters;
import java.util.*;

public class Main {
    public static void main(String[] args) {
//      定义集合
        HashSet<Student> students = new HashSet<>();
        HashMap<String, Student> studentHashMap = new HashMap<String, Student>();
//      插入集合
        students.add(new Student("chanbing",23));
        students.add(new Student("chuchu",12));
//      遍历集合
        for(Student st : students)
        {
            System.out.println(st);
        }
//      插入集合
        studentHashMap.put("first",new Student("cela",11));
        studentHashMap.put("second",new Student("dita",23));
//遍历集合
        Collection collection=studentHashMap.values();

        for (Object student: collection)
        {
            System.out.println(student);
        }

    }
}

class Student{
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

例子


import java.lang.reflect.Array;
import java.security.cert.CollectionCertStoreParameters;
import java.util.*;

public class Main {
    public static void main(String[] args) {

        ArrayList<Employee> employees = new ArrayList<>();

        MyDate myDate = new MyDate(1,1,2022);
        MyDate myDate1 = new MyDate(4,9,2023);
        MyDate myDate2 = new MyDate(11,25,2032);


        Employee employee = new Employee("Chandu",2344,myDate);
        Employee employee1 = new Employee("Jack",2334,myDate1);
        Employee employee2 = new Employee("Dister",4444,myDate2);

        employees.add(employee);
        employees.add(employee1);
        employees.add(employee2);

        employees.sort(new Comparator<Employee>() {
            @Override
            public int compare(Employee employee, Employee t1) {
                return (int)(employee.getSalary()-t1.getSalary()) ;
            }
        });



        for (Employee emp : employees)
        {
            System.out.println(emp);
        }
    }
}

class MyDate{
    private int month;
    private  int day;
    private  int year;

    public MyDate(int month ,int day,int year)
    {
        this.month=month;
        this.day=day;
        this.year=year;
    }
    public void setMonth(int month) {
        this.month = month;
    }

    public void setDay(int day) {
        this.day = day;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public int getMonth() {
        return month;
    }

    public int getDay() {
        return day;
    }

    public int getYear() {
        return year;
    }

    @Override
    public String toString() {
        return "MyDate{" +
                "month=" + month +
                ", day=" + day +
                ", year=" + year +
                '}';
    }
}
class Employee{
    private String name;
    private double salary;
    private MyDate birthday;

    public Employee(String name, double salary, MyDate birthday) {
        this.name = name;
        this.salary = salary;
        this.birthday = birthday;
    }

    public String getName() {
        return name;
    }

    public double getSalary() {
        return salary;
    }

    public MyDate getBirthday() {
        return birthday;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public void setBirthday(MyDate birthday) {
        this.birthday = birthday;
    }

    @Override
    public String toString() {
        return this.name+"\t"+this.salary+"\t"+this.birthday;
    }
}

泛型编程(自定义泛型)

定义语法:

class Classname<Typename1,Typename2...> {

        Typename attributes;

        Constructor...

        Methods...

}

接口

interface Interfacename<Typename1,Typename2...> {

        Typename attributes;

        Constructor...

        Methods...

}

实例化语法

Classname<Type...> className = new Classname<Type...>(arguments)

Classname<> className = new Classname<>(arguments)

接口

Interfacename<Type...> interfaceName = new Interfacename<Type...>(arguments)

Interfacename<> interfaceName = new Interfacename<>(arguments)

如下例子:


import java.lang.reflect.Array;
import java.security.cert.CollectionCertStoreParameters;
import java.util.*;

public class Main {
    public static void main(String[] args) {

//       设置数据类型为string
        Customize<String> goodName = new Customize<>("good name");
//        输出
        System.out.println(goodName);
//        输出给定数据类型
        goodName.showType();
    }
}
//定义如下自定义数据类型的类《T》
class Customize<T> {
    //    name是一个不确定数据类型
    T name;
    //构造器
    public Customize(T name) {
        this.name = name;
    }
    //tostring
    @Override
    public String toString() {
        return "Customize{" +
                "name=" + name +
                '}';
    }
    public  void showType()
    {
        System.out.println(this.name.getClass());
    }
}

例子


import java.lang.reflect.Array;
import java.security.cert.CollectionCertStoreParameters;
import java.util.*;

public class Main {
    public static void main(String[] args) {

//    不指定数据的类型,让运行时自动推导,但是这样效率不高。
        Customize<Object> objectCustomize = new Customize<>(1234);
//      输出。
        System.out.println(objectCustomize);
//        输出给定数据类型
        objectCustomize.showTyep();
    }
}
//定义如下自定义数据类型的类《T》
class Customize<T> {
//    name是一个不确定数据类型
    T name;
//构造器
    public Customize(T name) {
        this.name = name;
    }
//tostring
    @Override
    public String toString() {
        return "Customize{" +
                "name=" + name +
                '}';
    }

//    展示数据类型。
    public void showTyep()
    {
        System.out.println(this.name.getClass());
    }

}

使用泛型的注意事项

1.指定数据的类型必须是引用类型,比如如下的这就错了。


import java.lang.reflect.Array;
import java.security.cert.CollectionCertStoreParameters;
import java.util.*;

public class Main {
    public static void main(String[] args) {
//    设置int类型
        Customize<int> customize = new Customize<int>();

    }
}
class Customize<T>{
    T attribute;

    public Customize(T attribute) {
        this.attribute = attribute;
    }
}

改正后


import java.lang.reflect.Array;
import java.security.cert.CollectionCertStoreParameters;
import java.util.*;

public class Main {
    public static void main(String[] args) {
//    现在设置成了 Integer 数据类型.
        Customize<Integer> customize = new Customize<Integer>(232);

    }
}
class Customize<T>{
    T attribute;

    public Customize(T attribute) {
        this.attribute = attribute;
    }
}

2.如果指定了数据类型,也可以传入其子类型。


import java.lang.reflect.Array;
import java.security.cert.CollectionCertStoreParameters;
import java.util.*;

public class Main {
    public static void main(String[] args) {
//        正确,传入的是A()
        Customize<A> aCustomize = new Customize<A>(new A());
//        正确,传入的是A()的子类
        Customize<A> aCustomize1 = new Customize<A>(new B());

//        输出运行是类型
        aCustomize.showType();
        aCustomize1.showType();

    }
}
class Customize<T>{
    T attribute;

    public Customize(T attribute) {
        this.attribute = attribute;
    }

    public void showType()
    {
        System.out.println(attribute.getClass());
    }
}

class A {

}

class B extends A{

}

3.如果没有指定数据类型,默认的就是Object数据类型.


import java.lang.reflect.Array;
import java.security.cert.CollectionCertStoreParameters;
import java.util.*;

public class Main {
    public static void main(String[] args) {

        Customize aCustomize = new Customize();

//        等价于
        Customize<Object> objectCustomize = new Customize<>();
        

    }
}
class Customize<T>{
    T attribute;

    public Customize(){};

    public Customize(T attribute) {
        this.attribute = attribute;
    }

    public void showType()
    {
        System.out.println(attribute.getClass());
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/152892.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kafka zookeeper单机版安装部署全教程 含安装包

kafka zookeeper安装部署全教程 含安装包 大家好&#xff0c;我是酷酷的韩~ 一.基础软件安装 1.JDK安装部署 linux安装jdk1.8全教程(包含安装包) 二.安装包准备 1.kafka (kafka_2.12-2.8.0.tgz) https://kafka.apache.org/downloads 2.zookeeper (apache-zookeeper-3.7.…

最近爆火的电子血氧仪的基本原理

继口罩、抗原、药品之后,最近电子血氧仪的价格也开始水涨船高。从一个多月前的100多元,暴涨到了300多元。 那么,这类家用的电子血氧仪是如何工作的呢?测量数据到底准不准?今天就带大家来分析一下。 一、血氧仪工作原理 血氧仪是一种监测脉搏、血氧饱和度等指标的医疗器械…

人工智能-EM算法

目录1、EM算法2、EM算法介绍3、EM算法实例1、EM算法 EM算法&#xff1a;期望最大化算法。解决数据缺失情况下的参数估计问题 它是一个基础算法&#xff0c;是HMM等的基础 期望步:E步,最大步M步 步骤&#xff1a; 1&#xff0c;根据已经给出的观测数据&#xff0c;估计出模型参…

世界上第一款启用 QMK/VIA 的薄型无线机械键盘 Keychron K3 Pro 我刚刚入手

文章目录1. Keychron K3 Pro 是什么2. 键盘参数3. 打字音效测试4. 超薄5. 支持热插拔6. 薄型 Gateron 开关7. 薄型双射 PBT 键帽8. 多功能键9. 键盘部件可自定制10. 电池11. QMK 和 VIA 定制12. 产品清单13. 与 keychron k3 对比14. 与 keychron 其他系列对比14.1 为什么没有选…

Swin Transformer阅读笔记

Swin Transformer 使用了移动窗口的层级式的Vit&#xff08;Hierarchical Vision Transformer using Shifted Windows&#xff09; 总体来说&#xff1a;Swin Transformer想让Transformer像卷积神经网络一样&#xff0c;可以分为多个block&#xff0c;可以做层级式特征提取&a…

Flowable工作流——基础篇

1. 介绍 Flowable是BPMN的一个基于Java的软件实现&#xff0c;但是不仅仅限于BPMN&#xff0c;还有DMN决策表和CMMN Case管理引擎&#xff0c;并且有自己的用户管理&#xff0c;微服务API的功能&#xff0c;是一个服务平台。 是由开发了Acitivity6的开发人员&#xff0c;再次升…

nacos的使用

此篇博客是对nacos安装运行进行简单的介绍&#xff0c;后续博客会介绍下nacos的简单使用。nacos的安装安装可以去github上进行下载&#xff0c;下载地址&#xff08;不建议下载最新版本&#xff0c;可以找比较稳定的版本&#xff09;可以点解Tags查看所有历史版本我下载的是2.2…

基于 js 制作一个贪吃蛇小游戏

目录前言&#xff1a;项目效果展示&#xff1a;代码实现思路&#xff1a;使用方法&#xff1a;实现代码&#xff1a;总结&#xff1a;前言&#xff1a; 在工作学习之余玩一会游戏既能带来快乐&#xff0c;还能缓解生活压力&#xff0c;跟随此文一起制作一个小游戏吧。 描述&…

ESXI8.0一键安装黑群晖DSM7

&#x1f388; 作者&#xff1a;互联网-小啊宇 &#x1f388; 简介&#xff1a; CSDN 运维领域创作者、阿里云专家博主。目前从事 Kubernetes运维相关工作&#xff0c;擅长Linux系统运维、开源监控软件维护、Kubernetes容器技术、CI/CD持续集成、自动化运维、开源软件部署维护…

如何做好项目管理

项目管理概述 什么是项目 项目 是为创造独特的产品、服务或者成果而进行的临时性工作 项目三要素&#xff1a;临时性、独特性、渐进明确性 什么是项目管理 项目管理通过合理运营和整合项目相关活动&#xff0c;以满足项目目标达成的过程 项目与日常工作的区别 项目&…

设计测试用例

⭐️前言⭐️ 这篇文章主要介绍测试用例相关的知识&#xff0c;一个优秀的测试人员&#xff0c;需要具备设计优秀测试用例的能力。 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主将持续更新学习记录收获&…

基于启发式蝙蝠算法、粒子群算法、花轮询算法和布谷鸟搜索算法的换热器PI控制器优化(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 本文采用蝙蝠算法、粒子群优化、花轮询算法和布谷鸟搜索算法&#xff0c;对管壳式换热器的控制系统进行了建模和计算机仿真。为…

trie树入门

trie树分为普通的trie树和01trie树两者可以实现成树&#xff0c;很大一部分原因是&#xff1a;只有26个字母和01两种状态&#xff0c;一个结点度数不会太大&#xff0c;而且字符串长度和位数不会很大&#xff0c;更容易存储普通trie树维护了一堆字符串集合的前缀&#xff0c;in…

Elastic-Job分布式任务调度(4):Elastic-Job高级

1 事件追踪 Elastic-Job-Lite在配置中提供了JobEventConfiguration&#xff0c;支持数据库方式配置&#xff0c;会在数据库中自动创建JOB_EXECUTION_LOG和JOB_STATUS_TRACE_LOG两张表以及若干索引&#xff0c;来记录作业的相关信息。 1.1 修改Elastic-Job配置类 在ElasticJo…

电商人必读:2022中国电商市场发展洞察报告(人群、品类、品牌、玩法).pdf(附下载链接)...

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年12月份热门报告盘点罗振宇2023年跨年演讲PPT原稿吴晓波2022年年终秀演讲PPT原稿《底层逻辑》高清配图华为2021数字化转型&#xff1a;从战略到执行.pdf华为项目管理金种…

如何理解操作系统

路灯很多&#xff0c;希望你找到自己的月亮。 作者&#xff1a;阿润菜菜 目录 操作系统是什么 为什么设计操作系统 理解操作系统的作用 如何理解操作系统对软硬件管理&#xff1f; 操作系统为什么要对软硬件资源进行管理呢&#xff1f; 什么是系统调用和库函数 总结 操…

【docker13】Redis面试题

面试题 问题&#xff1a; 1~2亿条数据需要缓存&#xff0c;请问如何设计这个存储案例&#xff1f; 回答&#xff1a; 单机单台不可能的&#xff0c;肯定是分布式存储&#xff08;那如何用redis实现呢&#xff1f;) 解决1&#xff1a; 哈希取余分区 优点&#xff1a; 简单粗暴…

项目管理系统的类型

“系统”一词有两个不同的定义&#xff1a;一、定义某事如何完成的原则和程序&#xff0c;二、复杂整体的部分。因此&#xff0c;根据所使用的定义&#xff0c;项目管理系统也可以有两种不同的含义。 第一个是指定义如何执行项目的完整过程和原则系统。此定义包括所有项目管理以…

windows10上安装Python3.11.1

1&#xff09;下载Python3.11.1 Python官网下载地址&#xff1a;https://www.python.org/ package意思是下载压缩安装包&#xff0c;installer是.exe的安装程序。 根据自己电脑需求选择&#xff0c;这里我选择的是64位 2&#xff09;安装 双击安装包&#xff0c;进行安装。…

VScode编译调试C++环境

首先去官网下载vscodehttps://code.visualstudio.com/ 为了编译C/C&#xff0c;要使用gcc&#xff0c;Windows本身不支持gcc&#xff0c;所以有了MinGW&#xff0c;我用的是dev带的MinGW&#xff0c;也可以自己安装MinGW&#xff0c;或者用VS的编译器&#xff08;MinGW gcc下载…