JAVA----泛型

泛型

认识泛型

定义类、接口、方法时,同时声明了一个或者多个类型变量(如:) ,称为泛型类、泛型接口,泛型方法、它们统称为泛型。
作用:利用泛型,可以限制集合存储数据的类型.
泛型的本质:把具体的数据类型作为参数传给类型变量。

泛型类

类型变量建议用大写的英文字母,常用的有:E、T、K、V 等

public class ArrayList<E>{. . .
}修饰符 class 类名<类型变量,类型变量,…> { }
  1. 目标:了解泛型类的定义方式

需求:定义一个MyGenericCls类,要求该类有一个属性,属性的类型可以在创建对象时指定

public class MyGenericCls<E>{E name;public void setName(E name) {this.name = name;}public E getName() {return name;}
}
  //1.创建对象,将name的类型指定为StringMyGenericCls<String> cls1 = new MyGenericCls<>();cls1.setName("张三");String name1 = cls1.getName();System.out.println(name1);//2.创建对象,将name的类型指定为IntegerMyGenericCls<Integer> cls2 = new MyGenericCls<>();cls2.setName(666);Integer name2 = cls2.getName();System.out.println(name2);//3.泛型类的作用:可以提高一个类中数据类型的灵活性

泛型接口

  1. 目标:了解泛型接口的定义方式
public interface A<E>{. . .
}
修饰符 interface 接口名<类型变量,类型变量,…> { }

需求:定义一个泛型接口MyGenericInter,并定义实现类实现该接口

public interface MyGenericInter<E> {//接口名后面定义的泛型(类型变量),在整个接口中要使用数据类型的地方都可以用,可以提高一个接口中类型的灵活性void method1(E e);E method2();
}
public class InterImpl1 implements MyGenericInter<String>{@Overridepublic void method1(String s) {}@Overridepublic String method2() {return null;}
}
public class InterImpl2 implements MyGenericInter<Integer>{@Overridepublic void method1(Integer integer) {}@Overridepublic Integer method2() {return null;}
}

泛型方法

  1. 目标:了解泛型方法的定义方式
public static <T> void test(T t){   
}修饰符 <类型变量,类型变量,…>  返回值类型 方法名(形参列表) { }

需求:定义一个泛型方法,可以接收任意类型的引用数据类型数组,将其变成ArrayList集合返回

/*定义方法:数组的类型不确定!需要提高类型的灵活性* 明确参数:数组类型,数组的元素使用泛型变量* 明确返回值:ArrayList集合,集合中存储的元素和数组元素类型保持一致*/public static <T> ArrayList<T> arrToList(T[] arr) {//2.创建ArrayList集合对象ArrayList<T> list = new ArrayList<T>();//3.遍历数组for (int i = 0; i < arr.length; i++) {T data = arr[i];list.add(data);}return list;}
Integer[] arr1 = {11,22,33,44,55};
ArrayList<Integer> list1 = arrTolist(arr1);
System.out.println(list1);String[] arr2 = {"物", "罗"};
ArrayList<Integer> list2 = arrTolist(arr2);
System.out.println(list2);//[11, 22, 33, 44, 55]
//[物, 罗]

泛型通配符

通配符:?
可以在“使用泛型”的时候代表不确定的类型
泛型的上下限:
泛型上限: ? extends Car: ? 能接收的必须是Car或者其子类 。
泛型下限: ? super Car : ? 能接收的必须是Car或者其父类。
4. 目标:了解泛型通配符的使用方式
需求:优化sellApple和sellBanana两个方法,变成一个批量销售所有水果的方法

/*** 水果类*/
public class Fruit {
}//苹果类
public class Apple extends Fruit{
}//香蕉类
public class Banana extends Fruit{
}
//创建苹果集合
ArrayList<Apple> apples = new ArrayList<>();
//创建香蕉集合
ArrayList<Banana> bananas = new ArrayList<>();
    //public static void sellFruit(ArrayList<?> fruits){//场景:放入集合时,集合中的数据类型不确定,此时使用泛型通配符?,此时?代表一切类型//public static void sellFruit(ArrayList<?> fruits) {//场景:此时还是不确定给泛型变量赋什么类型,依然使用通配符?,不过要限制它的范围,使用通配符的上限//要求:?要么是水果类型,要么是水果的子类类型public static void sellFruit(ArrayList<? extends Fruit> fruits){System.out.println("销售水果");}//批量销售苹果public static void sellApple(ArrayList<Apple> apples) {System.out.println("销售苹果");}//批量销售香蕉public static void sellBanana(ArrayList<Banana> bananas) {System.out.println("销售香蕉");}
}
public static void main(String[] args) {//需求:优化sellApple和sellBanana两个方法,变成一个批量销售所有水果的方法//创建苹果集合ArrayList<Apple> apples = new ArrayList<>();//创建香蕉集合ArrayList<Banana> bananas = new ArrayList<>();//销售苹果和香蕉//sellApple(apples);//sellBanana(bananas);//sellBanana(apples);//sellApple(bananas);//此时方法的形参类型是ArrayList,所以sellFruit、sellApple、sellBanana三个方法的类型是一样的!sellFruit(apples);sellFruit(bananas);//创建狗集合,并销售ArrayList<Dog> dogs = new ArrayList<>();//有些时候,虽然不确定具体是什么类型,但是还是要限制一下类型的范围,此时需要限制类型是水果!//sellFruit(dogs);}

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

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

相关文章

Gitee简易使用流程(后期优化)

目录 1.修改用户名 2.文件管理 新建文件/文件夹流程如下&#xff1a; 上传文件流程如下&#xff1a; 以主页界面为起点 1.修改用户名 点解右上角的头像--> 点击“账号设置” 点击左边栏里的“个人资料“ 直接修改用户名即可 2.文件管理 选择一个有修改权限仓库&#…

【从0到1进阶Redis】主从复制

笔记内容来自B站博主《遇见狂神说》&#xff1a;Redis视频链接 1、概念 主从复制&#xff0c;是指将一个台 Redis 服务器的数据&#xff0c;复制到其他的 Redis 服务器。前者称为主节点&#xff08;master/leader&#xff09;&#xff0c;后者称为从节点&#xff08;slave/foll…

this指向解析

先看题目&#xff1a; 第一题&#xff1a; var name window var person1 { name: person1, show1: function () { console.log(this.name) }, show2: () > console.log(th show3: function () { return function () { …

MFC之对话框--重绘元文件

文章目录 实现示例展示需要绘制的窗口/位置控件位置更新下一次示例粗细滑动部分更新 重绘元文件&#xff08;窗口变化内容消失&#xff09;方法一&#xff1a;使用元文件方法二&#xff1a;兼容设备方法三&#xff1a;使用自定义类存储绘图数据除画笔外功能处理画笔功能处理 保…

springmvc1

以前的servlet程序&#xff1a; springmvc 不同的处理器&#xff1a;不同的方法或者处理类 所有的请求都会经过dispathcherservlet的doservice方法&#xff1a; mvc原理&#xff1a; 前端控制器&#xff1a;jsp或者什么东西

Python字符串基础与高级操作

在Python中&#xff0c;字符串是不可变的数据类型&#xff0c;用于存储一系列的字符。它们可以被创建、访问、操作和格式化&#xff0c;但一旦创建&#xff0c;其内容就不能改变。下面是一篇关于Python字符串技术的详细讲解&#xff0c;包括创建、访问、更新、转义、运算符、格…

Phpstudy 2018 之xhcms搭建

1、由于直接访问根目录无法进入网站 2、所以采用搭建网站&#xff0c;第一使用系统服务模式、选择php-5.4.45Apache模式 3、网站域名为本地ip地址或者127.0.0.1、端口8085 4、在navicat创建名字为xjcms的数据库&#xff0c;并导入sql数据库文件 5、浏览器输入127.0.0.1:8085直接…

中风伤寒、感冒、六经辨证笔记

目录 基础传经的原因传经的过程及速度传经的危害感冒时体痛头痛的原因根据头痛的位置辨经 太阳病太阳中风外风内热 表虚感冒颗粒&#xff08;桂枝葛根汤&#xff09; 少阳病辨病总结伤寒论原文半表半里太阳为开&#xff0c;阳明为阖&#xff0c;少阳为枢胆的作用帮助肠胃消化、…

deepstream读取mp4文件及不同类型视频输入bug解决

在deepstream中使用mp4文件&#xff0c;与rtsp类似&#xff0c;使用uridecodebin即可&#xff0c;&#xff08;可见官方test.py文件&#xff09; def create_source_bin(index, uri):print("Creating source bin")# Create a source GstBin to abstract this bins c…

定投投什么?

定投可以选择的品种有银行理财和基金 银行理财目前有的品种有期限限制&#xff0c;不是那么公开的特点。如果说你想通过定投积累一笔低风险的&#xff0c;用于应急或者短期内要用的钱&#xff0c;可以选择定投现金类银行理财。 基金是最适合定投的产品&#xff0c; 基金分为…

【自然语言处理】面向新冠肺炎的社会计算应用

面向新冠肺炎的社会计算应用 1 任务目标 1.1 案例简介 新冠肺炎疫情牵动着我们每一个人的心&#xff0c;在这个案例中&#xff0c;我们将尝试用社会计算的方法对疫情相关的新闻和谣言进行分析&#xff0c;助力疫情信息研究。本次作业为开放性作业&#xff0c;我们提供了疫情…

C++ STL stable_sort用法

一&#xff1a;功能 对区间内元素进行排序&#xff0c;保证相等元素的顺序&#xff08;稳定排序&#xff09; 二&#xff1a;用法 #include <iostream>struct Record {std::string label;int rank; };int main() {std::vector<Record> data {{"q", 1},…

代码随想录第五十一天 | 300.最长递增子序列 , 674. 最长连续递增序列 , 718. 最长重复子数组

300.最长递增子序列 看完想法&#xff1a;在dp递推公式那里没有太看得懂。首先dp【i】的状态肯定是由前面的dp【0】到dp【i-1】推出的&#xff0c;但是dp【0】到dp【i-1】可以推出dp【i】有个前提就是(nums【i】 > nums【0到i-1任意一个】),例如nums【1】 2, nums【3】 5…

Tomcat下载安装配置教程(零基础超详细)

「作者简介」&#xff1a;冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础著作 《网络安全自学教程》&#xff0c;适合基础薄弱的同学系统化的学习网络安全&#xff0c;用最短的时间掌握最核心的技术。 Tomcat 1、下载…

外包干了1个月,技术明显退步。。。

有一种打工人的羡慕&#xff0c;叫做“大厂”。 真是年少不知大厂香&#xff0c;错把青春插稻秧。 但是&#xff0c;在深圳有一群比大厂员工更庞大的群体&#xff0c;他们顶着大厂的“名”&#xff0c;做着大厂的工作&#xff0c;还可以享受大厂的伙食&#xff0c;却没有大厂…

【轻松拿捏 】Java-static关键字(面试)

Java-static关键字 1. 定义和基本概念 回答要点&#xff1a; 示例回答&#xff1a; 2. static 变量 回答要点&#xff1a; 示例回答&#xff1a; 代码示例&#xff1a; 3. static方法 回答要点&#xff1a; 示例回答&#xff1a; 代码示例&#xff1a; 4. static 代…

Modbus协议简介与Python实现

Modbus协议是工业自动化和控制系统中广泛使用的通信协议。自1979年由Modicon(现为施耐德电气的一部分)引入以来,它已经成为一种标准的通信协议,用于连接电子设备和传感器。Modbus协议基于主从架构,支持多种物理层和传输模式,如串行通信(RS-232/RS-485)和以太网。 1. Mo…

10个使用Numba CUDA进行编程的例子

以下是10个使用Numba CUDA进行编程的例子&#xff0c;这些例子涵盖了基本的向量加法、矩阵乘法以及其他一些常见操作&#xff1a; 向量加法 from numba import cuda import numpy as np cuda.jit def vector_add(a, b, c):i cuda.grid(1)if i < len(a):c[i] a[i] b[i] …

STM32智能交通监测系统教程

目录 引言环境准备智能交通监测系统基础代码实现&#xff1a;实现智能交通监测系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;交通监测与管理问题解决方案与优化收尾与总结 1. 引言 智能交通监测系统通…

Linux--线程池(包含日志的解释)

线程系列&#xff1a; Linux–线程的认识(一) Linux–线程的分离、线程库的地址关系的理解、线程的简单封装&#xff08;二&#xff09; 线程的互斥&#xff1a;临界资源只能在同一时间被一个线程使用 生产消费模型 信号量 线程池 线程池&#xff08;Thread Pool&#xff09;是…