java学习--泛型

news2024/9/25 9:40:50

前言

当我们将dog类放入集合List中想要遍历通过一下手段可实现遍历名字和年龄,但是当我们要加入一个新的Cat类时,他并不会报错,只有编译了才会报错,因为在这一步的时候注定了只能是Dog类,但这是非常不方便的

此时我们就可以使用到泛型,此时还没编译就会发出错误信息,非常有利于我们编写代码时有效发现错误。

泛型介绍

E表示泛型,当一个类使用了泛型且数据也是使用了泛型,那么创建该类型对象时,<>中写的类型就会是该类型E的类型,也可以理解为,<>中写的类型就会替代E,例如下图,创建对象时<>中写的是String,那么类中E a就相当于String a,里面其他的E也相当于String

泛型的声明与实例化

为创建HashMap时的样式,K,V为设计的泛型,当我们把<>中的KV写成String,Student,代表使用该类型中使用他们的K,V类型对应的就是String,Student。

通过下图这个代码,我们调用了entrySet()

,查看该方法源码,该方法是用接收的,且也用了K,V泛型所以此时,K,V也为相应的String,Student

使用迭代器也是一样的道理

示例1:

示例2:

但如果是子类就可以

示例3:

例题:

import java.util.ArrayList;
import java.util.Comparator;

/*
@author:我与java相爱相杀---c语言梦开始的地方
今天又是努力学习的一天!!!!
定义Employee类


5)创建该类的3个对象,并把这些对象放入ArrayList 集合中(ArrayList需使用泛
型来定义),对集合中的元素进行排序,并遍历输出:

排序方式:调用ArrayList的sort方法,传入Comparator对象[使用泛型],先按照
name排序,如果name相同,则按生日日期的先后排序。【即:定制排序】

教

韩
*/public class Test02 {
    public static void main(String[] args) {
        ArrayList<Employee> list = new ArrayList<>();
        list.add(new Employee("jack",1200,new MyDate(2004,3,1)));
        list.add(new Employee("ab",1300,new MyDate(2003,1,6)));
        list.add(new Employee("jack",1900,new MyDate(2004,1,1)));
        list.sort(new Comparator<Employee>() {
            @Override
            public int compare(Employee o1, Employee o2) {
                if (o1.getName().compareTo(o2.getName()) == 0) {
                    //对birthday的比较是更应该放到Mydate中比较,所以还可以优化
//                    if (o1.birthday.getYear() > o2.birthday.getYear() || o1.birthday.getYear() < o2.birthday.getYear())
//                        return o1.birthday.getYear() - o2.birthday.getYear();
//                    else {
//                        if (o1.birthday.getMonth() > o2.birthday.getMonth() || o1.birthday.getMonth() < o2.birthday.getMonth())
//                            return o1.birthday.getMonth() - o2.birthday.getMonth();
//                        else
//                            return o1.birthday.getDay() - o2.birthday.getDay();
//
//
//                    }
                   return o1.birthday.compareTo(o2.birthday);
                } else
                    return o1.getName().compareTo(o2.getName());
            }
        });
        System.out.println(list);

    }
}

//1)该类包含:private成员变量name,sal,birthday,其中birthday为MyDate类的对
//象;
//2)为每一个属性定义getter,setter方法;
//3)重写toString 方法输出 name, sal, birthday
class Employee{
    private String name;
    private double salary;
    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 void setName(String name) {
        this.name = name;
    }

    public double getSalary() {
        return salary;
    }

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

    public MyDate getBirthday() {
        return birthday;
    }

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

    @Override
    public String toString() {
        return "Employee{" +
                "name='" + name + '\'' +
                ", salary=" + salary +
                ", birthday=" + birthday +
                '}';
    }
}
//4)MyDate类包含:private成员变量month,day,year;并为每一个属性定义getter,
//setter 方法;
class MyDate implements Comparable<MyDate>{
    private int month;
    private int day;
    private  int year;

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

    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        this.month = month;
    }

    public int getDay() {
        return day;
    }

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

    public int getYear() {
        return year;
    }

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

    @Override
    public String toString() {
        return "MyDate{" +
                "month=" + month +
                ", day=" + day +
                ", year=" + year +
                '}';
    }


    @Override
    public int compareTo(MyDate o) {
        if (o.getYear() > year || o.getYear() < year)
            return year-o.getYear();
        else {
            if (o.getMonth() > month || o.getMonth() < month)
                return month-o.getMonth();
            else
                return day-o.getDay();

        }
    }
}


自定义泛型

示例一:

示例2:

示例3:

泛型的继承和通配符

JUnit

需要运行哪个方法就在哪个方法前加@Test,点击旁边得绿色箭可直接运行该方法

import org.junit.jupiter.api.Test;

import java.util.*;

/*
@author:我与java相爱相杀---c语言梦开始的地方
今天又是努力学习的一天!!!!
定义个泛型类DAO<T>,在其中定义一个Map成员变量,Map的键为String类型,值为T类型

分别创建以下方法:
(1)public void save(String id,T entity):保存T类型的对象到Map成员变量中
(2) public T get(String id):从map中获取 id 对应的对象
(3) public void update(String id,T entity):替换map中key为id的内容,改为 entity对象
(4)public List<T>list():返回map中存放的所有T对象
(5) public void delete(String id):删除指定id对象

定义一个User类:
该类包含:private成员变量(int类型)id,age;(String类型)name。
创建DAO类的对象,分别调用其save、get、update、list、delete方法来操作User对象,
体田 Jnit 苗元河计米社

*/public class test03 {
    public static void main(String[] args) {
        DAO<User> dao = new DAO<>();
        dao.save("1",new User(1,19,"jack"));

        System.out.println( dao.get("1"));
       dao.update("1",new User(1,19,"map"));
        System.out.println(dao.list());
       dao.delete("1");
        System.out.println(dao);



    }
}
class User{
    private int id;
    private int age;
    private String name;

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

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}
class DAO<T>{
    Map<String ,T> map = new HashMap<>();
    @Test
    public void save(String id,T entity)
    {
        map.put(id,entity);
        System.out.println(map);
    }
    @Test
    public T get(String id)
    {
        return map.get(id);

    }
    @Test
    public void update(String id,T entity)
    {
        map.replace(id, entity);
        System.out.println(map);
    }
    @Test
    public List<T> list()
    {
        List<T> list = new ArrayList<>();
        Set<String> set = map.keySet();
        for (String s :set) {
            list.add(map.get(s));


        }


        return list;

    }
    @Test
    public void delete(String id)
    {
        map.remove(id);
        System.out.println(map);
    }

    @Override
    public String toString() {
        return "DAO{" +
                "map=" + map +
                '}';
    }
}

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

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

相关文章

哦吼,新模型?文生图领域的新模型FLUX.1(附模型下载网盘地址和详细使用方法)

&#x1f3a1;背景 Black Forest Labs 是由 Stable Diffusion 原班人马成立的公司&#xff0c;致力于研发优质的多模态模型并开源。该公司由多位前 Stability AI 研究员组成&#xff0c;包括 Robin Rombach 在内的团队成员&#xff0c;他们在图像和视频生成领域有着杰出的贡献…

取消订单业务

文章目录 概要整体架构流程技术细节小结 概要 取消订单是电子商务、外卖平台、在线零售等多个行业中常见的业务需求之一。这项功能允许消费者或商家取消已下的订单&#xff0c;通常是因为各种原因&#xff08;如商品缺货、配送问题、支付问题等&#xff09;。 需求分析以及接…

【课程总结】day19(中):Transformer架构及注意力机制了解

前言 本章内容&#xff0c;我们将从注意力的基础概念入手&#xff0c;结合Transformer架构&#xff0c;由宏观理解其运行流程&#xff0c;然后逐步深入了解多头注意力、多头掩码注意力、融合注意力等概念及作用。 注意力机制&#xff08;Attension&#xff09; 背景 深度学…

如何在立创EDA的PCB电路板导入logo图案

1、首先制作好logo图案&#xff0c;一般为公司logo图标&#xff0c;如下图 2、打开立创EDA的PCB文件&#xff0c;如下图 3、将PCB的图层切换到丝印层&#xff1a; 4、然后选择EDA菜单栏的放置---图片&#xff1a; 5、进入后点击选择图片&#xff0c;将logo图片导入&#xff0c;…

人生低谷来撸C#--022 winfrom 和WPF

1、简单介绍 标题其实是写错了&#xff0c;是winform,不是winfrom&#xff0c;如果再准确点&#xff0c;应该是 WinForms&#xff08;复数形式&#xff09;&#xff0c;它代表的是 Windows Forms 技术&#xff0c;用于在 .NET Framework 中创建桌面应用程序的用户界面。在 Vis…

数据结构——八大排序

一.排序的概念和其应用 1.1排序的概念 排序&#xff1a;排列或排序是将一组数据按照一定的规则或顺序重新组织的过程&#xff0c;数据既可以被组织成递增顺序&#xff08;升序&#xff09;&#xff0c;或者递减顺序&#xff08;降序&#xff09;。稳定性&#xff1a;假定在待…

Prometheus监控的搭建(ansible安装——超详细)

目录 1.各组件功能介绍 2.安装批量部署工具ansbile 3.执行服务器 4.各服务器间做免密 5.下载安装包 5.1Prometheus的下载的下载地址 5.2exporter的下载地址 5.3grafana的下载地址 6.编辑ansible需要的配置文件 7.编写ansible文件 8.验证执行结果 今天和大家分享一下…

网站在线查询工具箱源码分享

终极网络工具系统”(SAAS)&#xff0c;是一款功能强大的PHP脚本在线查询工具。本版集合了超过470种快速且易用的Web工具&#xff0c;为日常任务处理和开发人员提供了极大的便利。作为一款综合性的网络工具系统&#xff0c;66toolkit不仅满足了用户的基本网络需求&#xff0c;更…

Java面试题 -- 为什么重写equals就一定要重写hashcode方法

在回答这个问题之前我们先要了解equals与hascode方法的本质是做什么的 1. equals方法 public boolean equals(Object obj) {return (this obj);}我们可以看到equals在不重写的情况下是使用判断地址值是否相同 所以默认的 equals 的逻辑就是判断的双方是否引用了一个对象&am…

【EI会议征稿】第四届高性能计算与通信工程国际学术会议(HPCCE 2024)

出版出版 【SPIE出版 | 往届会后3个月内完成EI检索】 第四届高性能计算与通信工程国际学术会议(HPCCE 2024) 2024 4th International Conference on High Performance Computing and Communication 第四届高性能计算与通信工程国际学术会议&#xff08;HPCCE 2024&#xf…

使用Chainlit接入通义千问快速实现一个自然语言转sql语言的智能体

文本到 SQL 让我们构建一个简单的应用程序&#xff0c;帮助用户使用自然语言创建 SQL 查询。 最终结果预览 ​ 先决条件 此示例有额外的依赖项。你可以使用以下命令安装它们&#xff1a; pip install chainlit openai​ 导入 应用程序 from openai import AsyncOpenAI…

扩展------零拷贝技术(Mmap,SendFile)

什么是零拷贝 零拷贝&#xff08;Zero-Copy&#xff09;是一种计算机操作技术&#xff0c;旨在减少数据在内存之间的拷贝次数&#xff0c;以提高数据传输的效率和性能。 传统的IO模式&#xff1a; 模拟网络传输数据运行过程&#xff1a; 用户态read()发起系统调用&#xff0c…

Flink中上游DataStream到下游DataStream的内置分区策略及自定义分区策略

目录 全局分区器GlobalPartitioner 广播分区器BroadcastPartitioner 哈希分区器BinaryHashPartitioner 轮询分区器RebalancePartitioner 重缩放分区器RescalePartitioner 随机分区器ShufflePartitioner 转发分区器ForwardPartitioner 键组分区器KeyGroupStreamPartitio…

力扣SQL50 第二高的薪水 ifnull() 分页

Problem: 176. 第二高的薪水 &#x1f468;‍&#x1f3eb; 参考题解 Code select ifNull((select distinct salaryfrom employeeorder by salary desclimit 1,1),null) as SecondHighestSalary

【Python数据结构与算法】分治----汉诺塔问题

题目&#xff1a;汉诺塔问题 描述 古代有一个梵塔&#xff0c;塔内有三个座A、B、C&#xff0c;A座上有n个盘子&#xff0c;盘子大小不等&#xff0c;大的在下&#xff0c;小的在上。三个座都可以用来放盘子。有一个和尚想把这n个盘子从A座移到C座&#xff0c;但每次只能允许移…

AWS SES 认证策略设置全攻略:轻松掌握简单步骤!

最近&#xff0c;我有机会设置 Amazon Simple Email Service&#xff08;以下简称&#xff1a;SES&#xff09;的认证策略&#xff0c;所以这次写下来作为备忘。 前言 Amazon Simple Email Service&#xff08;SES&#xff09;是一项通过 API 端点或 SMTP 接口进行邮件发送的服…

MySQL:VIEW视图

概述 MySQL 视图&#xff08;View&#xff09;是一种虚拟存在的表&#xff0c;同真实表一样&#xff0c;视图也由列和行构成&#xff0c;但视图并不实际存在于数据库中。行和列的数据来自于定义视图的查询中所使用的表&#xff0c;并且是在使用视图时动态生成的。 数据库中只…

从Notion Sites的推出,分析SaaS服务发展浪潮

引言 前段时间&#xff0c;Notion发布了新功能“Notion Sites”&#xff0c;允许用户直接在Notion中编辑页面并将其作为网站发布。其实在此之前&#xff0c;一些SaaS&#xff08;软件即服务&#xff09;软件也具有该功能&#xff0c;比如HelpLook AI知识库、Squarespace、Wix等…

buu做题(13)

[BSidesCF 2019]Kookie 给了一个账户: cookie / monster 根据提示, 我们需要以 admin 的身份登录 抓个包 , 可以发现一个奇怪的地方, Set-Cookie: usernamecookie; 以这样的方式确定登录的用户, 尝试伪造一下 直接 加上一个请求头: Cookie:usernameadmin 就可以得到flag 也…

卡码网--数组篇(二分法)

系列文章目录 文章目录 系列文章目录前言数组二分查找 前言 详情看&#xff1a;https://programmercarl.com/ 总结知识点用于复习 数组 概念: 数组是存放在连续内存空间上的相同类型数据的集合。 数组可以方便的通过下标索引的方式获取到下标对应的数据。 特点&#xff1a;…