当前位置: 首页 > news >正文

java泛型学习

没有java泛型会存在的问题

  1. 假设我们有一个方法,希望通过传递不同类型的参数,输出不同类型的对象值。正常情况下我们可能会写不同的方法来实现,但是这样会导致类不断增加,并且类方法很相似,不能够复用。进而导致类爆炸
  2. 假设有一个方法,我们希望传参具有一定约束,而不是像Object对象一样随便传参

java泛型的常见使用

包装类型参数

  1. 定义一个方法,打印各种包装类型
public class Generics1<T> {private T name;public Generics1(T name) {this.name = name;}public void allPrint(){System.out.println(name);}
}
  • main
public class Main {public static void main(String[] args) {Generics1<Integer> integerGenerics1 = new Generics1<>(1);integerGenerics1.allPrint();Generics1<String> stringGenerics2 = new Generics1<>("222222");stringGenerics2.allPrint();Generics1<Long> longGenerics3 = new Generics1<>(222L);longGenerics3.allPrint();}
}

注意:泛型里面必须是对象,或者包装类型。基础类型是不被允许的

多个包装类型参数

  1. 两个泛型参数
public class Generics2<T,K> {private T name;private K context;public Generics2(T name,K context) {this.name = name;this.context=context;}public void allPrint(){System.out.println(name);System.out.println(context);}
}
  • Main
public class Main2 {public static void main(String[] args) {Generics2<String, Integer> stringIntegerGenerics2 = new Generics2<>("1111", 222);stringIntegerGenerics2.allPrint();}
}

上界继承

  1. 限定使用者传递的参数必须继承某个父类之下
public class Generics3<T extends Vehicle> {private T name;public Generics3(T name) {this.name = name;}public void allPrint(){System.out.println(name.getName());}
}
  • 父类
public class Vehicle {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public void run(String name){System.out.println(name+"can run");}
}
  • 子类
public class Car extends Vehicle{private Integer wheel;public Integer getWheel() {return wheel;}public void setWheel(Integer wheel) {this.wheel = wheel;}public void getWheel(String name,Integer wheel) {System.out.println(name+"有"+wheel+"个轮子");}
}
  1. 可以不是父 类,可以是接口。接口有更好的扩展性
public class Generics4<T extends Vehi> {private T vehics;public Generics4(T vehics) {this.vehics = vehics;}public void allPrint(){vehics.run();}
}
  • 接口
public interface Vehi {void run();
}

使用上界继承的好处

  1. 使用上界继承的最大好处是:必然我们会用到接口或者父类,那么我们可以抽取一些公共方法,放到父类或接口里面。不同的实现拥有不同的处理方式。具备更强的扩展性
  2. java里面虽然有Object来实现传递各种类型参数(如下),但是不推荐这么做。会产生一种。例如:当我们从List取值的时候,java是无法推断里面值的类型,编译器就会报错

错误示例

上面这个代码在运行时,获取第二个值时,就会报错。
使用Object,在编译阶段是没有问题的,但是在运行时就会出现问题。
而使用泛型,在编译阶段,就能检查出来问题

泛型函数:Generic method

泛型函数方法的定义

  1. 在返回类型前添加泛型类型: 。参数设置为泛型
private static <T> void printAll(T myOb){
}
  1. 举例子
public class Main5 {public static void main(String[] args) {printAll(new BigCar(3,"myba"));}private static <T> void printAll(T myOb){System.out.println(myOb);}
}
  1. 同理也可以使用上界继承限定
    private static <T> void printAll(T myOb){System.out.println(myOb);}
private static <T extends Vehicle & Vehi> void printAll(T myOb){System.out.println(myOb);
}
  1. 配置多个参数
private static <T,K> void printAll2(T myOb,K myob2){System.out.println(myOb);System.out.println(myob2);
}

泛型通配符

  1. String,Integer,Long我们在传递参数时,可以用Object来定义参数。但是:List,却不是List的子类。这种情况怎么处理?
  2. 通配符的使用
private static void printAll(List<?> myOb){System.out.println(myOb);
}

上界通配符

  1. 意思是,传入的参数必须是Vehi的子类或者实现,或者本身
private static void printAll(List<? extends Vehi> myOb){System.out.println(myOb);
}

下界通配符

  1. 意思是传入的参数必须是Car的父类或者Car本身
private static void printAll(List<? super Car> myOb){System.out.println(myOb);
}

相关文章:

java泛型学习

没有java泛型会存在的问题 假设我们有一个方法&#xff0c;希望通过传递不同类型的参数&#xff0c;输出不同类型的对象值。正常情况下我们可能会写不同的方法来实现&#xff0c;但是这样会导致类不断增加&#xff0c;并且类方法很相似&#xff0c;不能够复用。进而导致类爆炸…...

vscode c++ 开发环境配置

今天各位同学已经安装了mingw环境&#xff0c;但部分同学vscode开发环境又问题&#xff0c;究其原因&#xff0c;还是vscode 编译环境配置错误&#xff0c;有问题的同学 按如下步骤处理&#xff1a; 1、卸载相关插件。按下列步骤重新安装插件。 2、继续在搜索框中搜索并安装 C…...

PHP安装配置

文章目录 1.下载PHP2.配置环境变量3.Apache安装配置 1.下载PHP PHP即“超文本预处理器”&#xff0c;是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言&#xff0c;与C语言类似&#xff0c;是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及 PHP 自创的语法…...

std::vector<>的{}用法与stl中的共享指针

讨论 std::vector&#xff1c;&#xff1e;的{}用法比较方便&#xff0c;在stl中的共享指针中是否适用&#xff1f; 代码 #include <iostream> #include <memory> #include <vector> using namespace std;int main() {vector<int> vt1({1,3,5});vec…...

《FFmpeg开发实战:从零基础到短视频上线》资源下载和内容勘误

资源下载 下面是《FFmpeg开发实战&#xff1a;从零基础到短视频上线》一书用到的工具和代码资源&#xff1a; 1、本书使用的FFmpeg版本为FFmpeg 5.1.2&#xff0c;也可在FFmpeg的github主页上下载最新的FFmpeg源码。 2、本书第12章使用的Android Studio版本为Android Studio D…...

OpenCV目标识别

一 图像轮廓 具有相同颜色或强度的连续点的曲线。 图像轮廓的作用 可以用于图像分析 物体的识别与检测 注意 为了检测的准确性&#xff0c;需要先对图像进行二值化或Canny操作。 画轮廓时会修改输入的图像。 轮廓查找的API findContours(img,mode,ApproximationMode,...)…...

密码学及其应用——为什么选择接近的质数因子对RSA加密算法不安全?

RSA加密算法是一种广泛使用的非对称加密算法&#xff0c;它的安全性依赖于大整数分解的难度。具体来说&#xff0c;RSA算法生成的公钥包含一个大整数N&#xff0c;这是两个大质数p和q的乘积。然而&#xff0c;如果这两个质数p和q太接近&#xff0c;则可以相对容易地对N进行因式…...

爱心商城管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;企业管理&#xff0c;用户管理&#xff0c;论坛管理&#xff0c;商品管理&#xff0c;公告管理&#xff0c;用户捐赠 企业账户功能包括&#xff1a;系统首页&#xff0c;个人中…...

【python】linux下安装chromedriver

首先&#xff0c;安装selenium模块 pip3 install selenium查看系统内chrome版本&#xff1a; google-chrome --version 根据谷歌浏览器版本下载对应的浏览器驱动版本&#xff1a; wget https://storage.googleapis.com/chrome-for-testing-public/126.0.6478.114/linux64/ch…...

Day18—使用Scrapy框架快速开发爬虫

Scrapy是一个强大的Python框架,用于快速开发爬虫程序。它提供了一整套工具来处理网页爬取和数据提取,非常适合于数据挖掘和信息抓取。本文将详细介绍如何使用Scrapy框架,包括创建项目、编写爬虫规则、设置中间件和管道等。 1. Scrapy框架概述 Scrapy框架以其高性能、易用性…...

04--MySQL8.0_JDBC

第一章 JDBC概述 之前我们学习了JavaSE,编写了Java程序,数据保存在变量、数组、集合等中,无法持久化,后来学习了IO流可以将数据写入文件,但不方便管理数据以及维护数据的关系; 后来我们学习了数据库管理软件MySQL,可以方便的管理数据1。 那么如何将它俩结合起来呢?即…...

OPENCV中0x00007FFE5F35F39C发生异常

原因&#xff1a;读取图片时已经为灰度图像&#xff0c;又进行了一次灰度处理cvtColor 解决方法&#xff1a;如上图所示&#xff0c;将cv::imread的第二个参数改为cv::IMREAD_COLOR&#xff1b;或者保留cv::IMREAD_GRAYSCALE&#xff0c;删去后面的cv::cvtColor...

Python 设计模式(第2版) -- 第三部分(行为型模式)

Python 设计模式(第2版) 再介绍下行为型设计模式。 行为型模式&#xff0c;顾名思义&#xff0c;它主要关注的是对象的责任。它们用来处理对象之间的交互&#xff0c;以实现更大的功能。行为型模式建议&#xff1a;对象之间应该能够彼此交互&#xff0c;同时还应该是松散耦合…...

EXCEL数据导入HIVE

引言 本文将论述如何将Windows本地的excel表数据&#xff0c;导入到虚拟机Linux系统中的Hadoop生态中的Hive数据仓库中。 实验准备 DBeaver Hive3.1&#xff08;Hadoop3.1&#xff09; excel数据表 实验步骤 一、首先打开虚拟机&#xff0c;启动Hadoop&#xff0c;启动h…...

C语言常用标准头文件

头文件的基础概念 在C的系列语言程序中&#xff0c;头文件&#xff08;通常扩展名为.h&#xff09;被大量使用&#xff0c;它通常包含函数、变量、结构体等的声明和定义&#xff0c;以及一些宏定义和类型定义。头文件的主要作用是为了方便管理和重用代码&#xff0c;它可以被多…...

vuejs3用gsap实现动画

效果 gsap官网地址&#xff1a; https://gsap.com/ 安装gsap npm i gsap 创建Gsap.vue文件 <script setup> import {reactive, watch} from "vue"; import gsap from "gsap"; const props defineProps({value:{type:Number,default:0} }) cons…...

企业级-PDF文件下载

作者&#xff1a;fyupeng 技术专栏&#xff1a;☞ https://github.com/fyupeng 项目地址&#xff1a;☞ https://github.com/fyupeng/rpc-netty-framework 留给读者 一、介绍 文件下载在浏览器可以根据响应头设置纯下载和直接打开两种方式。 二、代码 RequestMapping("/…...

00 - React 基础

1. React 基础 安装react指令 可参考&#xff1a; 官网官网使用教程 如&#xff1a; npx create-react-app 项目名 如&#xff1a;npx create-react-app react-redux-proJSX JSX 是一种 JavaScript 的语法扩展&#xff0c;类似于 XML 或 HTML&#xff0c;允许我们在 Java…...

基于WPF技术的换热站智能监控系统17--项目总结

1、项目颜值&#xff0c;你打几分&#xff1f; 基于WPF技术的换热站智能监控系统01--项目创建-CSDN博客 基于WPF技术的换热站智能监控系统02--标题栏实现-CSDN博客 基于WPF技术的换热站智能监控系统03--实现左侧加载动画_wpf控制系统-CSDN博客 基于WPF技术的换热站智能监…...

CI /CD学习

CI/CD概述 CI/CD 是持续集成和持续交付/部署的缩写&#xff0c;旨在简化并加快软件开发生命周期。 持续集成&#xff08;CI&#xff09;是指自动且频繁地将代码更改集成到共享源代码存储库中的做法。持续交付和/或持续部署&#xff08;CD&#xff09;是一个由两部分组成的过程…...

基于matlab的高斯滤波与图像去噪

1 高斯滤波原理 1.1 原理 高斯滤波是一种线性平滑滤波技术&#xff0c;主要用于消除图像中的高斯噪声。它的工作原理可以理解为对整幅图像进行加权平均的过程&#xff0c;即每个像素点的值都由其本身和邻域内的其他像素值经过加权平均后得到。 高斯滤波实质上是一种信号的滤…...

解决 uniapp h5 页面在私有企微iOS平台 间歇性调用uni api不成功问题(uni.previewImage为例)。

demo <template><view class"content"><image class"logo" src"/static/logo.png"></image><button click"previewImage">预览图片</button></view> </template><script> //打…...

Jenkins nginx自动化构建前端vue项目

在现代的Web开发中&#xff0c;Vue.js已经成为一种非常流行的JavaScript框架。为了更高效地管理和部署Vue.js项目&#xff0c;使用自动化构建工具是至关重要的。Jenkins作为一款强大的持续集成和持续部署&#xff08;CI/CD&#xff09;工具&#xff0c;为我们提供了一种便捷的方…...

Devicetree - 删除某个节点或属性

在设备树&#xff08;devicetree&#xff09;中&#xff0c;删除语法用于从现有设备树中删除属性或节点。这通常在设备树覆盖文件&#xff08;DTS&#xff09;或片段文件中完成。该语法使用 /delete-property/ 和 /delete-node/ 指令。 以下是如何使用这些指令的示例&#xff1…...

Xcode will continue when the operation completes

Xcode 15后,连接手机经常出现 Preparing iPhone. Xcode will continue when the operation completes.记录一下解决办法。其他提示&#xff0c;Xcode连接不上手机也可以尝试通过这个方法解决。 注意:最好关闭科学上网再操作。 从Xcode取消iPhone的配对(右键单击 -Unpair Devi…...

Python爬虫-贝壳新房

前言 本文是该专栏的第32篇,后面会持续分享python爬虫干货知识,记得关注。 本文以某房网为例,如下图所示,采集对应城市的新房房源数据。具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。接下来,跟着笔者直接往下看正文详细内容。(附带完整代码) 正文 地…...

Canvas绘制图片和区域

如何使用Canvas在图片上绘制区域&#xff1f; 一. 首先&#xff0c;我们需要初始化三个canvas画布&#xff08;初始化Canvas&#xff09; initCanvas() {// 初始化canvas画布let canvasWrap document.getElementsByClassName("canvas-wrap");this.wrapWidth canva…...

Day10—Spark SQL基础

Spark SQL介绍 ​ Spark SQL是一个用于结构化数据处理的Spark组件。所谓结构化数据&#xff0c;是指具有Schema信息的数据&#xff0c;例如JSON、Parquet、Avro、CSV格式的数据。与基础的Spark RDD API不同&#xff0c;Spark SQL提供了对结构化数据的查询和计算接口。 Spark …...

开源技术:在线教育系统源码及教育培训APP开发指南

本篇文章&#xff0c;小编将探讨如何利用开源技术开发在线教育系统及教育培训APP&#xff0c;旨在为有志于此的开发者提供全面的指导和实践建议。 一、在线教育系统的基本构架 1.1架构设计 包括前端、后端和数据库三个主要部分。 1.2前端技术 在前端开发中&#xff0c;HTML…...

[C++][设计模式][观察者模式]详细讲解

目录 1.动机2.模式定义3.要点总结4.代码感受1.代码一1.FileSplitter.cpp2.MainForm.cpp 2.代码二1.FileSplitter.cpp2.MainForm.cpp 1.动机 在软件构建过程中&#xff0c;需要为某些对象建立一种“通知依赖关系” 一个对象(目标对象)的状态发生改变&#xff0c;所有的依赖对象…...