Java泛型的定义与运用

news2024/9/22 3:58:51

泛型

泛型的作用从使用层面上来说是统一数据类型,防止将来的数据转换异常。从定义层面上来说,定义带泛型的类,方法等,将来使用的时候给泛型确定什么类型,泛型就会变成什么类型,凡是涉及到泛型的都会变成确定的类型,代码更灵活。
不使用泛型,少了限制,则在集合添加数据就不会类型异常的错误,导致运行结果出错。

public class Test {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add("1");
        list.add(666);
        list.add(true);
        for (Object o : list) {
            String s = (String) o;
            System.out.println(s.length());
        }
    }
}

在这里插入图片描述

  1. 泛型中的类型必须是引用类型
  2. 如果泛型不写,默认类型为Object

泛型的定义

含有泛型的类

new对象的时候确定类型,格式:

public class 类名<E>{ }
public class MyArrayList <E>{
    Object[] obj = new Object[5];//定义一个数组,充当ArrayList底层的数组,长度直接规定为10
    int size;
    public boolean add(E e){ //定义一个add方法,参数类型需要和泛型类型保持一致
        obj[size] = e;
        size++;
        return true;
    }
    @Override
    public String toString() {
        return Arrays.toString(obj);
    }
}
public class Test {
    public static void main(String[] args) {
        Student<String> list1 = new Student<>();
        list1.add("张三");
        list1.add("李四");
        System.out.println(list1);//直接输出对象名,默认调用toString
        Student<Integer> list2 = new Student<>();
        list2.add(1);
        list2.add(2);
        System.out.println(list2);
    }
}

在这里插入图片描述

含有泛型的方法

调用的时候确定类型,其格式:

修饰符 <E> 返回值类型 方法名(E e)
public class Student {
    public static <E> void addAll(ArrayList<E> list, E...e){ //定义一个静态方法addAll,添加多个集合的元素,传入可变参数
        for (E element : e) {
            list.add(element);
        }
    }
}
public class Test {
    public static void main(String[] args) {
        ArrayList<String> list1 = new ArrayList<>();
        Student.addAll(list1, "张三", "李四");
        System.out.println(list1);
        ArrayList<Integer> list2 = new ArrayList<>();
        Student.addAll(list2, 1, 2);
        System.out.println(list2);
    }
}

在这里插入图片描述

含有泛型的接口

格式:

public interface 接口名<E>{  }

什么时候确定类型分两种,一种是在实现类的时候还没有确定类型,只能在new实现类的时候确定类型了,例如ArrayList。一种是在实现类的时候直接确定类型了比如Scanner。

public interface MyList <E>{
    public boolean add(E e);
}
public class MyArrayList<E> implements MyList<E>{
    Object[] obj = new Object[5];
    int size;
    public boolean add(E e){ //定义一个add方法,参数类型需要和泛型类型保持一致
        obj[size] = e;
        size++;
        return true;
    }
    @Override
    public String toString() {
        return Arrays.toString(obj);
    }
}
public class Test {
    public static void main(String[] args) {
        MyArrayList<String> list = new MyArrayList<>();
        list.add("张三");
        list.add("李四");
        System.out.println(list);
    }
}

在这里插入图片描述

泛型通配符

泛型通配符使得我们能够更加灵活地处理泛型类型,使代码更通用且可复用。包括以下几类
E:Element (在集合中使用,因为集合中存放的是元素)
T:Type(Java 类)
K:Key(键)
V:Value(值)
N:Number(数值类型)
?:表示不确定的 java 类型

public class Test {
    public static void main(String[] args) {
        ArrayList<String> list1 = new ArrayList<>();
        list1.add("张三");
        list1.add("李四");
        ArrayList<Integer> list2 = new ArrayList<>();
        list2.add(1);
        list2.add(2);
        test(list1);
        test(list2);
    }
    public static void test(ArrayList<?> list){ //?表示不确定的 java 类型
        for (Object o : list) {
            System.out.println(o);
        }
    }
}

泛型的上限下限

泛型的上下限可以规定泛型的范围
上限:?只能接收extends后面的本类类型以及子类类型
格式:<? extends 类型>
下限:?只能接收super后面的本类类型以及父类类型
格式:<? super 类型>
Integer的父类Number
Number的父类Object
在这里插入图片描述

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

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

相关文章

飞时达土方计算软件:工程师的得力助手

初识飞时达 飞时达土方计算软件&#xff0c;如同一位默默无闻的工匠&#xff0c;静静地伫立在我的工作台上。它没有华丽的外表&#xff0c;也没有炫目的光环&#xff0c;但它的存在&#xff0c;却如同一盏明灯&#xff0c;照亮了我前行的道路。 初识飞时达&#xff0c;是在一…

Word文件打开密码设置:掌握这两种方法,保护你的文档安全

在日常工作和学习中&#xff0c;我们经常会使用Microsoft Word来创建和编辑文档。有时候&#xff0c;为了保护文档内容不被未经授权的人员查看或修改&#xff0c;我们通常会采用加密的方式来增加其安全性。那么Word文档怎么加密&#xff1f; 方法一&#xff1a;使用Word软件内置…

GTK是如何加密WLAN组播和广播数据的?

1. References WLAN 4-Way Handshake如何生成GTK&#xff1f;_tk bigtk gtk igtk-CSDN博客 2. 概述 在Wi-Fi网络中&#xff0c;单播、组播和广播帧的加密算法是由AP决定的。其中组播帧和广播帧的加密使用GTK密钥&#xff0c;其PTK的密钥结构如下图所示&#xff1a; GTK的组成…

【技术选型】FastDFS、OSS如何选择

【技术选型】FastDFS、OSS如何选择 开篇词&#xff1a;干货篇&#xff1a;FastDFS&#xff1a;OSS&#xff08;如阿里云OSS&#xff09;&#xff1a; 总结篇&#xff1a;我是杰叔叔&#xff0c;一名沪漂的码农&#xff0c;下期再会&#xff01; 开篇词&#xff1a; 文件存储该选…

YOLOv8改进 | 注意力机制 | 对密集和小目标友好的EVAblock 【原理 + 完整代码】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

Open3D SVD算法实现对应点集配准

目录 一、概述 1.1基本思想 1.2实现步骤 二、代码实现 三、实现效果 3.1原始点云 3.2配准后点云 3.3变换矩阵 一、概述 在点云配准中&#xff0c;SVD&#xff08;Singular Value Decomposition&#xff0c;奇异值分解&#xff09;方法是一种常用的精确计算旋转和平移变…

前端开发攻略---webSocket的简单实现与使用

1、演示 2、实现流程 安装依赖 npm i ws 服务端代码 const WebSocket require(ws)// 创建一个 WebSocket 服务器&#xff0c;监听端口 3000 const wss new WebSocket.Server({ port: 3000 })// 监听连接事件 wss.on(connection, function connection(ws) {console.log(客户端…

互联网医院系统,开发互联网医院设计哪些功能?

随着科技的进步和数字化转型的推动&#xff0c;互联网医院系统已成为现代医疗服务的重要组成部分。这一系统通过整合信息技术与医疗资源&#xff0c;为用户提供便捷、高效的医疗服务。以下是互联网医院系统的主要功能介绍。 1、在线咨询与诊断 互联网医院系统允许患者通过网络平…

信息打点web篇--端口扫描-waf识别-蜜罐识别

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要整理信息打点时 服务器类型&#xff0c;端口扫描&#xff0c;waf类型&#xff0c;蜜罐的识别。 端口扫描 描述: 简单介绍一下&#xff0c;端口扫描就是扫描对方服务器开放了哪些端口。 我们从他的端口…

彩色图像(RGB)或灰度图像(Gray)转tensor数据(附img2tensor代码)

&#x1f4aa; 专业从事且热爱图像处理&#xff0c;图像处理专栏更新如下&#x1f447;&#xff1a; &#x1f4dd;《图像去噪》 &#x1f4dd;《超分辨率重建》 &#x1f4dd;《语义分割》 &#x1f4dd;《风格迁移》 &#x1f4dd;《目标检测》 &#x1f4dd;《暗光增强》 &a…

【fscan】Windows环境下的fscan安装与使用指南

Fscan是一款专为网络安全专业人士设计的多功能扫描工具&#xff0c;它能够帮助用户在Windows环境中执行高效的网络扫描任务。以下是关于Fscan的详细使用指南&#xff1a; 获取Fscan 要开始使用Fscan&#xff0c;首先需要从其GitHub仓库下载最新版本的预编译二进制可执行文件。…

AI数字人直播系统搭建开发

目录 前言&#xff1a; 一、数字人直播系统 在技术层面&#xff1a; 二、商业层面&#xff1a; 三、用户体验层面&#xff1a; 总结&#xff1a; 前言&#xff1a; 直播渠道是目前比较热门的售货方式&#xff0c;数字人直播作为一种新兴的直播形式&#xff0c;具有其独特…

提升爬虫OCR识别率:解决嘈杂验证码问题

引言 在数据抓取和网络爬虫技术中&#xff0c;验证码是常见的防爬措施&#xff0c;特别是嘈杂文本验证码。处理嘈杂验证码是一个复杂的问题&#xff0c;因为这些验证码故意设计成难以自动识别。本文将介绍如何使用OCR技术提高爬虫识别嘈杂验证码的准确率&#xff0c;并结合实际…

【线程同步-2】

同步方法及同步块 接上期三大不安全案例&#xff0c;本期将介绍同步方法和同步块&#xff0c;以期达到安全的目的。 车站买票&#xff1a;加入了synchronized 同步方法 package syn; ​ //不安全的买票 //线程不安全&#xff0c;有负数 public class UnsafeBuyTicket {publi…

【线程同步-1】

三大不安全案例 1、车站买票 package syn; ​ //不安全的买票 //线程不安全&#xff0c;有负数 public class UnsafeBuyTicket {public static void main(String[] args) {BuyTicket buyTicket new BuyTicket();new Thread(buyTicket,"xiaoming").start();new Thr…

一些关于C++的基础知识

引言&#xff1a;C兼容C的大部分内容&#xff0c;但其中仍有许多小细节的东西需要大家注意 一.C的第一个程序 #include <iostream> using namespace std;int main() {cout << "hello world!" << endl;return 0; } 第一次看这个是否感觉一头雾水…

如何用Vue3和Plotly.js创建交互式平行坐标图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 Vue.js 中使用 Plotly.js 创建平行坐标图 应用场景介绍 平行坐标图是一种可视化高维数据集的强大技术。它可以帮助我们探索不同维度之间的关系&#xff0c;并识别模式和异常值。在 Vue.js 应用程序中&#xf…

Scissor算法-从含有表型的bulkRNA数据中提取信息进而鉴别单细胞亚群

在做基础实验的时候&#xff0c;研究者都希望能够改变各种条件来进行对比分析&#xff0c;从而探索自己所感兴趣的方向。 在做数据分析的时候也是一样的&#xff0c;我们希望有一个数据集能够附加了很多临床信息/表型&#xff0c;然后二次分析者们就可以进一步挖掘。 然而现实…

yolov8 人体姿态识别

引言 在计算机视觉的各种应用中&#xff0c;人体姿态检测是一项极具挑战性的任务&#xff0c;它能够帮助我们理解人体各部位的空间位置。本文将详细介绍如何使用 YOLOv8 和 Python 实现一个人体姿态检测系统&#xff0c;涵盖模型加载、图像预处理、姿态预测到结果可视化的全流…

探索 Qt 的 `QSqlDatabase`:数据库访问的桥梁

&#x1f60e; 作者介绍&#xff1a;欢迎来到我的主页&#x1f448;&#xff0c;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff08;领取大厂面经等资料&#xff09;&#xff0c;欢迎加我的…