Java基础(泛型)

news2024/11/13 8:58:09

文章目录

前言

一、泛型类的定义

1.1 泛型类的定义语法

1.2 代码使用示例

二、泛型类的使用语法

2.1 使用语法

2.2 泛型类注意事项

 2.3 泛型类的使用小案例

三、从泛型类派生子类(2种情况)

 3.1 子类和父类的泛型类型要保持一致

3.2 子类没有使用泛型

四、泛型接口

4.1 泛型接口的语法定义

4.2 泛型接口的使用(2种情况)


前言

本篇文章主要讲解泛型最基本的定义与用法,为后续Java的学习打牢基础


一、泛型类的定义

  • 1.1 泛型类的定义语法

class 类名称 <泛型标识、泛型标识、...> {
    private 泛型标识 变量名;
    ......
}

常用的泛型标识 T、E、K、V

  • 1.2 代码使用示例

/**
 * 泛型类的定义
 */
public class Generic<T> {

    // T 是由外部使用类的时候来指定的。
    private T key;

    public Generic(T key) {
        this.key = key;
    }

    public T getKey() {
        return key;
    }

    public void setKey(T key) {
        this.key = key;
    }

    @Override
    public String toString() {
        return "Generic{" +
        "key=" + key +
        '}';
    }
}

二、泛型类的使用语法

  • 2.1 使用语法

//使用语法
类名<具体的数据类型> 对象名 = new 类名<具体的数据类型>();
//java 1.7以后,后边的<>中具体的数据类型可以省略不写
类名<具体的数据类型> 对象名 = new 类名<>();
  • 2.2 泛型类注意事项

  1. 泛型类如果没有指定具体的数据类型,此时,操作类型是Object
  2. 泛型的类型参数只能是类类型,不能是基本数据类型
  3. 泛型类型在逻辑上可以看成是多个不同的类型,但实际上是相同类型
  •  2.3 泛型类的使用小案例

        年终抽奖器案例:

/**
 * 抽奖器
 */
public class ProductGetter<T> {
    //奖金或者奖品
    private T product;
    //定义奖品、奖金池
    ArrayList<T> arrayList = new ArrayList<>();
    //添加奖品到奖品池
    public void addProduct(T t) {
        arrayList.add(t);
    }
    //定义一个随机数、用来抽选奖品
    Random random = new Random();
    //抽奖
    public T getProduct() {
        product = arrayList.get(random.nextInt(arrayList.size()));
        return product;
    }
}
public class Test {
    public static void main(String[] args) {
        ProductGetter<String> stringProductGetter = new ProductGetter<>();
        String[] strPro = {"华为手机", "苹果手机", "扫地机器人", "咖啡机"};
        //将奖品放入奖金池
        for(int i = 0;i < strPro.length;i++){
            stringProductGetter.addProduct(strPro[i]);
        }
        String product = stringProductGetter.getProduct();
        System.out.println("恭喜您抽中了,"+product);
        System.out.println("************************************");
        ProductGetter<Integer> IntegerProductGetter = new ProductGetter<>();
        Integer[] intPro = {100,1000,10000,20000};
        //将奖品放入奖金池
        for(int i = 0;i < intPro.length;i++){
            IntegerProductGetter.addProduct(intPro[i]);
        }
        Integer product1 = IntegerProductGetter.getProduct();
        System.out.println("恭喜您,获得了:"+product1+"元");
    }
}

 可以将上述案例自己敲一遍进行理解,若能全部理解则说明已经入门

三、从泛型类派生子类(2种情况)

1、子类也是泛型类,子类和父类的泛型类型要保持一致

class ChildGeneric<T> extends Generic<T>

2、子类不是泛型类,父类要明确泛型类的数据类型

class ChildGeneric extends Generic<String>
  • 3.1 子类和父类的泛型类型要保持一致

定义父类如下:

public class Parent<E> {

    private E value;

    public E getValue() {
        return value;
    }

    public void setValue(E value) {
        this.value = value;
    }
}

 定义子类如下:

/**
 * 泛型类派生子类,如果子类也是泛型类,子类的泛型标识要和父类一致。
 * @param <T>
 */
public class ChildFirst<T> extends Parent<T> {

    @Override
    public T getValue() {
        return super.getValue();
    }
}

定义测试类如下:

public class Test {
    public static void main(String[] args) {
        ChildFirst<String> childFirst = new ChildFirst<>();
        childFirst.setValue("123");
        String value = childFirst.getValue();
        System.out.println(value);
    }
}

子类和父类的泛型类型要保持一致,而在创建子类的过程中,我们可以发现如下问题:

可以看到,如果不对父类指定数据类型,则会默认为Object,虽然可以成功创建子类,但是可能会导致后续内容的报错

而如果父类指定了数据类型,但是和子类指定的数据类型不同,则会在创建子类时就进行报错

  • 3.2 子类没有使用泛型

当子类没有使用泛型时,父类的泛型类操作的就是一个Object,可以从重写的getValue()方法的返回值看出来,父类提供的类型是Object

当子类没有使用泛型时,父类也无法指定泛型,因为在创建子类对象时,我们无法确定父类的泛型所使用的数据类型

也因此,我们需要明确父类的数据类型,以此避免后续因使用Object类型而可能出现的问题

四、泛型接口

  • 4.1 泛型接口的语法定义

interface 接口名称 <泛型标识,泛型标识,...>{
    泛型标识 方法名();
    ......
}

 代码使用示例:

/**
 * 泛型接口
 */
public interface Igeneric<T> {
   abstract T getName(T name);
}
  • 4.2 泛型接口的使用(2种情况)

  1. 实现类不是泛型类,接口要明确数据类型
  2. 实现类也是泛型类,实现类和接口的泛型类型要一致

   (大致用法与泛型类相同,注意接口与类的区别即可)

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

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

相关文章

苹果秋季发布会前瞻:iPhone 16领衔新品盛宴

苹果定档9月9日&#xff0c;揭开新品神秘面纱 苹果公司近日正式宣布&#xff0c;将于9月9日在加州库比蒂诺的Apple Park&#xff0c;史蒂夫乔布斯剧院举办年度秋季新品发布会&#xff0c;主题为“It’s Glowtime”&#xff0c;预示着Siri界面将迎来一场华丽变身。此次发布会较原…

AUTOSAR_EXP_ARAComAPI.pdf的第4章笔记

为了理解AUTOSAR_EXP_ARAComAPI.pdf的第4章内容&#xff0c;生搬硬套的翻译了一把&#xff0c;准备先囫囵吞枣&#xff0c;再仔细理解。因为这些内容的理解也不是一时半会儿的。所以先放上来。 1.AUTOSAR_EXP_ARAComAPI.pdf的介绍 通常&#xff0c;阅读正式的规范并不是学习和…

【扩散模型(六)】IP-Adapter 是如何训练的?2 源码篇(IP-Adapter Plus)

系列文章目录 【扩散模型&#xff08;二&#xff09;】IP-Adapter 从条件分支的视角&#xff0c;快速理解相关的可控生成研究【扩散模型&#xff08;三&#xff09;】IP-Adapter 源码详解1-训练输入 介绍了训练代码中的 image prompt 的输入部分&#xff0c;即 img projection…

ASP.NET MVC+LayUI视频上传完整教程

前言 前段时间在使用APS.NET MVCLayUI做视频上传功能的时&#xff0c;发现当上传一些内存比较大的视频就会提示上传失败&#xff0c;后来通过查阅相关资料发现.NET MVC框架为考虑安全问题&#xff0c;在运行时对请求的文件的长度&#xff08;大小&#xff09;做了限制默认为4M…

缓存Mybatis一级缓存与二级缓存

缓存 为什么使用缓存 缓存(cache)的作用是为了减去数据库的压力,提高查询性能,缓存实现原理是从数据库中查询出来的对象在使用完后不销毁,而是存储在内存(缓存)中,当再次需要获取对象时,直接从内存(缓存)中提取,不再向数据库执行select语句,从而减少了对数据库的查询次数,因此…

力扣之字母异位词分组(python)

题目 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "nat&qu…

回归预测|基于鹅GOOSE优化LightGBM的数据回归预测Matlab程序 多特征输入单输出 2024年优化算法

回归预测|基于鹅GOOSE优化LightGBM的数据回归预测Matlab程序 多特征输入单输出 2024年优化算法| 文章目录 前言回归预测|基于鹅GOOSE优化LightGBM的数据回归预测Matlab程序 多特征输入单输出 2024年优化算法GOOSE-LightGBM 一、GOOSE-LightGBM模型原理&#xff1a;流程&#xf…

【STM32】IIC

超级常见的外设通信方式&#xff0c;一般叫做I方C。 大部分图片来源&#xff1a;正点原子HAL库课程 专栏目录&#xff1a;记录自己的嵌入式学习之路-CSDN博客 目录 1 基本概念 1.1 总线结构 1.2 IIC协议 1.3 软件模拟IIC逻辑 2 AT24C02 2.1 设备地址与…

华为手机数据丢失如何恢复?

在智能手机普及的今天&#xff0c;华为手机凭借其卓越的性能和用户体验赢得了众多用户的青睐。然而&#xff0c;在使用过程中&#xff0c;我们难免会遇到数据丢失或误删除的情况。面对这一困境&#xff0c;许多用户可能会感到束手无策。别担心&#xff0c;本文将为你提供一份全…

什么是响应式?

表达式: 用于表达式进行插值,渲染到页面之中 语法: {{ 表达式 }} 案例 <template><h1>{{ arr[2] }}</h1><h1>{{ 9 5 }}</h1><h1>{{ "神奇" }}</h1> </template><script setup> import { ref } from vue; …

react中配置Sentry

sentry 打开sentrySentry Docs | Application Performance Monitoring &amp; Error Tracking Software官网&#xff0c; 注册。根据提示创建应用后 在 React 应用中配置 Sentry 可以按照以下步骤进行&#xff1a; 安装 Sentry SDK: 在项目根目录下运行&#xff1a; npm in…

DDR5 Channel SI设计的挑战

DDR5延续了前几代数据速率不断提高的趋势。数据传输速度在3200至6400MT/s之间。同时将继续像前几代一样使用单端数据线的方式。为了帮助减少由高数据速率引起的信号完整性问题&#xff0c;DRAM端也会考虑加入判决反馈均衡&#xff08;DFE&#xff09;来减轻反射、ISI对信号传输…

十、Java异常

文章目录 一、异常简介二、异常体系图三、常见的异常3.1 常见的运行时异常3.2 常见的编译异常 四、异常处理4.1 异常处理的方式4.2 try-catch异常处理4.2.1 try-catch异常处理基本语法4.2.2 try-catch异常处理的注意细节 4.3 throws异常处理4.3.1 throws异常处理基本介绍4.3.2 …

Android - Windows平台下Android Studio使用系统的代理

这应该是第一篇Android的博文吧。以后应该会陆续更新的。记录学习Android的点点滴滴。 之前也看过&#xff0c;不过看完书就忘了&#xff0c;现在重拾Android&#xff0c;记录学习历程。 为何要用代理 因为更新gradle太慢了。 如何使用系统的代理 先找到系统代理的ip和端口。…

YOLO与PyQt5结合-增加论文工作量-实现一个目标检测的UI界面

这是个简单的界面&#xff0c;Qtdesigner支持各种界面&#xff0c;支持替换背景添加图标等。 接下来实现一个简单YOLO目标检测界面&#xff1a; 功能&#xff1a; 1、在窗口打开视频或图片进行目标检测&#xff0c;具有中断检测功能&#xff1a;比如检测视频的时候突然打开图…

速盾:cdn可以解决带宽问题么

一、速盾 CDN 的基本概念 CDN&#xff08;Content Delivery Network&#xff09;即内容分发网络&#xff0c;速盾 CDN 是这一技术的具体应用。它的工作原理是通过在全球多地部署服务器节点&#xff0c;将网站的内容缓存到这些节点上。 速盾 CDN 具有诸多优势。首先&#xff0…

分布式百万商户架构之缓存技术 本地化及未来之窗行业应用跨平台架构

如果数据读取速度比文件读取慢&#xff0c;将数据缓存到文件有以下优点&#xff1a; 一、提高读取效率 当需要反复访问某些数据时&#xff0c;从缓存文件中读取可以大大减少读取时间。因为文件系统通常会对文件进行一定程度的优化&#xff0c;使得文件的读取更加高效。而相比之…

优雅回收多个成员变量内存——使用函数模板实现内存安全释放

目录 从析构类中的多个成员说起什么是函数模板使用函数模板 从析构类中的多个成员说起 你有没有遇到过这种情况&#xff0c;一个类的构造函数中new了很多个成员变量&#xff0c;在析构函数中回收内存时&#xff0c;写了一遍又一遍 下面的代码&#xff1a; if (ptr ! nullptr)…

EXCEL文件如何批量加密,有什么方法

EXCEL文件的加密&#xff0c;通常在EXCEL软件上进行设置&#xff0c;它有打开密码与写保护密码&#xff0c;如果有多个文件的话&#xff0c;想通过一键设置的方法进行密码设置&#xff0c;那么它通常需要用到第三方软件进行批处理&#xff0c;因为EXCEL软件只能对当前打开的文件…

Wan-本科阶段部分作品

1、简易无接触温度测量与身份识别装置&#xff08;电赛 省一&#xff09; 2、基于交叉带式分拣结构的智能垃圾分类系统&#xff08;工训赛 省二&#xff09; 3、基于STM32的智能语音风扇&#xff08;大创优秀结题&#xff09;