【java学习—十一】泛型(1)

文章目录

  • 1. 为什么要有泛型Generic
  • 2. 泛型怎么用
    • 2.1. 泛型类
    • 2.2. 泛型接口
    • 2.3. 泛型方法
  • 3. 泛型通配符
    • 3.1. 通配符
    • 3.2. 有限制的通配符


1. 为什么要有泛型Generic

在这里插入图片描述

    泛型,JDK1.5新加入的,解决数据类型的安全性问题,其主要原理是在类声明时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这样在类声明或实例化时只要指定好需要的具体的类型即可。
    Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。同时,代码更加简洁、健壮。

举例:

package day11;import java.util.ArrayList;
import java.util.List;public class Test {public static void main(String[] args) {List list = new ArrayList<>();//不指定泛型,可以向list集合中添加各种类型元素list.add(111);list.add("sss");list.add(true);//需求,只能在集合中存字符串List<String> l = new ArrayList<String>();l.add("xx");
//		l.add(111);//指定的String类型,不可以添加String以外的元素类型}}

    Java中的泛型,只在编译阶段有效。在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦除,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。也就是说,泛型信息不会进入到运行时阶段
    解释:
    视频中老师说:比如上段代码中最后一行的l.add(111)在编译期间就会报错,只有删除这一行,或者将里面的数据改成String类型后,才可以通过编译。

2. 泛型怎么用

2.1. 泛型类

对象实例化时不指定泛型,默认为: Object 。
泛型不同的引用不能相互赋值。

package day11;import java.util.ArrayList;
import java.util.List;public class Test {public static void main(String[] args) {A<String> a1 = new A<String>();//在new A的对象的时候,指定泛型的类型Stringa1.setKey("xxxx");//对象使用setKey(T key)方法,中的key形参就是StringSystem.out.println(a1.getKey());//T getKey(),返回值就有new对象确定返回值是StringA<Integer> a2 = new A<Integer>();a2.setKey(1);Integer i = a2.getKey();A a3 = new A();//不指定泛型,相当于指定了一个Object类型//A<Object> a3 = new A<Object>();//等同于上行代码a3.setKey(new Object());Object obj = a3.getKey();//同样的类,但是在new对象时指定不同的数据类型,那么这些对象不能互相赋值a1 = a2;//错误,不同的数据类型不能互相赋值}}/*** 此处的泛型‘T’可以任意的取名,即可换成A,B,C等* 一般使用T,译为type* @author 14532** @param <T>*/
class A<T>{//< >中的内容可以任何取名,按惯例是Tprivate T key;public void setKey(T key) {this.key = key;}public T getKey() {return this.key;}
}

2.2. 泛型接口

定义一个泛型接口:

interface Generator<T> {
    T next();
}

①未传入泛型实参时,与泛型类的定义相同,在声明类的时候,需将泛型的声明也一起加到类中
②如果实现接口时,指定接口的泛型的具体数据类型,这个类实现接口所有方法的位置都要替换实际的具体数据类型

举例:

package day11;public class Test1 {public static void main(String[] args) {B1<Object> b1 = new B1<Object>();B1<String> b11 = new B1<String>();B2 b2 = new B2();//不用指定泛型,指定泛型反而会报错}
}interface IB<T>{T test(T t);
}/*** 未传入泛型实参时,与泛型类的定义相同,在声明类的时候,需将泛型的声明也一起加到类中* @author 14532** @param <T>*/
class B1<T> implements IB<T>{//B1<T>:未传入实参,将泛型的声明<T>也一起加到类中@Overridepublic T test(T t) {return t;}
}/*** 如果实现接口时指定接口的泛型的具体数据类型* 这个类实现接口所有方法的位置都要替换实际的具体数据类型* @author 14532**/
class B2 implements IB<String>{@Overridepublic String test(String t) {return null;}
}

2.3. 泛型方法

    方法,也可以被泛型化,不管此时定义在其中的类是不是泛型化的。在泛型方法中可以定义泛型参数,此时,参数的类型就是传入数据的类型。

泛型方法的格式:

public class DAO {
    public <E> void show(E e){
        System.out.println(e.toString());
    }
    public <T> T show1(T t){
        return t;
    }
}

举例:

class Cc{/*** 无返回值的泛型方法* @param <T>* @param s*/public <T> void test(T s) {T t = s;}/*** 有返回值的泛型方法* @param <T>* @param s* @return*/public <T> T test1(T s) {return s;}/*** 形参为可变参数的泛型方法* @param <T>* @param strs*/public <T> void test2(T... strs) {for(T s : strs) {System.out.println(s);}}}

举例2:

package day11;public class Test1 {public static void main(String[] args) {Cc<Object> c = new Cc<Object>();c.test("xxx");//泛型方法在调用之前没有固定的数据类型//在调用时,传入的参数是什么类型,就会把泛型改成什么类型//也就是说,泛型方法会在调用时确定泛型的具体数据类型Integer i = c.test1(2);//传递的参数是Integer,泛型就固定成Integer,返回值就是IntegerBoolean b = c.test1(true);//传递的参数是Boolean,泛型就固定成Boolean,返回值就是Boolean}
}class Cc<E>{private E e;//	public static void test3() {
//		//在静态方法中不能使用类定义的泛型,如果要使用泛型,只能使用静态方法自己定义的泛型
//		//System.out.println(this.e);
//	}/*** 静态方法的泛型方法* @param <T>* @param t*/public static <T> void test3(T t) {//在静态方法中不能使用类定义的泛型,如果要使用泛型,只能使用静态方法自己定义的泛型System.out.println(t);}/*** 无返回值的泛型方法* @param <T>* @param s*/public <T> void test(T s) {//在类上定义的泛型,可以在普通的方法中使用System.out.println(this.e);T t = s;}/*** 有返回值的泛型方法* @param <T>* @param s* @return*/public <T> T test1(T s) {return s;}/*** 形参为可变参数的泛型方法* @param <T>* @param strs*/public <T> void test2(T... strs) {for(T s : strs) {System.out.println(s);}}}

3. 泛型通配符

3.1. 通配符

不确定集合中的元素具体的数据类型,使用"?"表示所有类型
如:

	public void test(List<?> list){System.out.println(list);}

举例:

package day11;import java.util.ArrayList;
import java.util.List;public class Test2 {public static void main(String[] args) {Dd d = new Dd();List<String> l1 = new ArrayList<String>();//?:可以代表各种类型,如String、Integerd.test(l1);List<Integer> l2 = new ArrayList<Integer>();d.test(l2);}}class Dd {public void test(List<?> list) {//test方法需要一个list集合的参数,不确定list集合中到底是存的数据的类型是什么}
}

3.2. 有限制的通配符

举例:

<? extends Person> (无穷小, Person)
只允许泛型为Person及Person父类的引用调用

<? super Person> [Person, 无穷大]
只允许泛型为Person及Person父类的引用调用

<? extends Comparable>
只允许泛型为实现Comparable接口的实现类的引用调用

举例:

package day11;import java.util.ArrayList;
import java.util.List;public class Test2 {public static void main(String[] args) {Dd d = new Dd();//list参数的元素数据类型是CC1及其子类List<CC1> lc = new ArrayList<CC1>();d.test1(lc);List<DD1> ld = new ArrayList<DD1>();d.test1(ld);//		List<BB1> lb = new ArrayList<BB1>(); //BB1不是CC1的子类
//		d.test1(lb);//list参数的元素数据类型是CC1及其父类 d.test2(lc);List<BB1> lb = new ArrayList<BB1>();d.test2(lb);List<AA1> la = new ArrayList<AA1>();d.test2(la);//		d.test2(ld);//DD1不是CC1的父类//list参数的元素数据类型是IA的实现类List<IAImpl> lia = new ArrayList<IAImpl>();d.test3(lia);//		d.test3(la);//AA1不是IA的实现类}
}class Dd {public void test(List<?> list) {//test方法需要一个list集合的参数,不确定list集合中到底是存的数据的类型是什么}public void test1(List<? extends CC1> list) {//list参数的元素数据类型是CC1及其子类}public void test2(List<? super CC1> lsit) {//参数的元素数据类型是CC1及其父类 }public void test3(List<? extends IA> lsit) {//list参数的元素数据类型是IA的实现类}
}class AA1{}class BB1 extends AA1{}class CC1 extends BB1{}class DD1 extends CC1{}interface IA{}class IAImpl implements IA{}

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

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

相关文章

通过Google搜索广告传送的携带木马的PyCharm软件版本

导语 最近&#xff0c;一起新的恶意广告活动被发现&#xff0c;利用被入侵的网站通过Google搜索结果推广虚假版本的PyCharm软件。这个活动利用了动态搜索广告&#xff0c;将广告链接指向被黑客篡改的网页&#xff0c;用户点击链接后下载的并不是PyCharm软件&#xff0c;而是多种…

矢量图形编辑软件illustrator 2023 mac中文软件特点

illustrator 2023 mac是一款矢量图形编辑软件&#xff0c;用于创建和编辑排版、图标、标志、插图和其他类型的矢量图形。 illustrator 2023 mac软件特点 矢量图形&#xff1a;illustrator创建的图形是矢量图形&#xff0c;可以无限放大而不失真&#xff0c;这与像素图形编辑软…

leetcode:1446. 连续字符(python3解法)

难度&#xff1a;简单 给你一个字符串 s &#xff0c;字符串的「能量」定义为&#xff1a;只包含一种字符的最长非空子字符串的长度。 请你返回字符串 s 的 能量。 示例 1&#xff1a; 输入&#xff1a;s "leetcode" 输出&#xff1a;2 解释&#xff1a;子字符串 &q…

Spire.doc读取模板文档,并在书签处插入内容

在书签位置插入文字 //加载模板文档 Document document new Document(Server.MapPath("~/File/评价结果.doc")); //创建书签导航器 BookmarksNavigator bn new BookmarksNavigator(document); //添加一个section到文档 Section newSec document.AddSection(); …

Java设计模式之命令模式

目录 定义 结构 案例 优点 缺点 使用场景 JDK源码解析 Thread中start与run方法的区别 定义 将一个请求封装为一个对象&#xff0c;使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通&#xff0c;这样方便将命令对象进行存储、传递、调用、增…

字体文件名称成中的Bold, Light,Italic,Regular, Medium是什么意思?

解释 字体文件名&#xff1a; IntelOneMono-Bold.ttf其中IntelOneMono字体名称 Bold 字体的样式 .ttf字体后缀 样式英文 中文Bold粗体BoldItalic粗体斜体Italic斜体Light细体LightItalic斜细体Medium中等MediumItalic中等斜体Regular标准以下来自鸿蒙字体以下来自鸿蒙字体TC…

大坝水库安全监测终端MCU,智能化管理的新篇章!

我国目前拥有超过9.8万座水库大坝&#xff0c;其中超过95%为土石坝&#xff0c;这些大坝主要是在上世纪80年代以前建造的。这些水库大坝在保障防洪、发电、供水、灌溉等方面发挥了巨大的作用&#xff0c;但是同时也存在一定的安全风险&#xff0c;比如坝体结构破损、坝基渗漏、…

基于 Center 的 3D 目标检测和跟踪

论文地址&#xff1a;https://arxiv.org/abs/2006.11275 论文代码&#xff1a;https://github.com/tianweiy/CenterPoint 3D 目标通常表示为点云中的 3D Boxes。 CenterPoint 在第一阶段&#xff0c;使用关键点检测器检测对象的中心&#xff0c;然后回归到其他属性&#xff0…

接入文心一言实战(一):API申请与测试

大家好&#xff0c;我是豆小匠。 这期来介绍申请百度文心一言API的步骤。 第一步 注册百度智能云账号 网址&#xff1a;https://login.bce.baidu.com/new-reg?tplbceplat&fromportal 第二步&#xff1a;申请预置模型 网址&#xff1a;https://console.bce.baidu.com/qi…

在虚拟机centos7中部署docker+jenkins最新稳定版

在虚拟机centos7中部署dockerjenkins最新稳定版 查看端口是否被占用 lsof -i:80 查看运行中容器 docker ps 查看所有容器 docker ps -a 删除容器 docker rm 镜像/容器名称 强制删除 docker rmi -f 镜像名 查看当前目录 pwd 查看当前目录下所有文件名称 ls 赋予权限 chown 777 …

unity中meta文件GUID异常问题

错误信息&#xff1a; The .meta file Assets/Scripts/Editor/ConvertConfigToBinary/TxtConverter.cs.meta does not have a valid GUID and its corresponding Asset file will be ignored. If this file is not malformed, please add a GUID, or delete the .meta file and…

【C语法学习】6 - gets()函数

文章目录 1 函数原型2 参数3 返回值4 读取机制5 示例 1 函数原型 gets()&#xff1a;从标准输入流stdin读取一个字符串存储到str指向的内存空间&#xff0c;函数原型如下&#xff1a; char *gets(char *str)2 参数 gets()函数的参数只有一个str&#xff1a; str是一个指向c…

智力测试情商测试小程序源码/带流量主提升智力微信小程序源码

智力测试情商测试小程序源码&#xff0c;这是一个考验智力&#xff0c;心理上面的一个测试游戏&#xff0c;支持多种测试方法。 比如有: 智商测试丨情商测试 | 性格测试丨爱情测试 | 抑郁症测试丨焦虑症测试 | 心理压力测试丨生活满意度测试&#xff0c;通过不同的测试&#xf…

win10pycharm和anaconda安装和环境配置教程

windows10 64位操作系统下系统运行环境安装配置说明 下载和安装Anaconda&#xff0c;链接https://www.anaconda.com/download 下载完后&#xff0c;双击exe文件 将anaconda自动弹出的窗口全部关掉即可&#xff0c;然后配置高级系统变量 根据自己的路径&#xff0c;配置…

如何在Linux命令行界面愉快进行性能测试?

本人在做性能测试的过程中&#xff0c;遇到一个问题&#xff0c;测试机选了一台Linux服务器&#xff0c;只有命令行界面。执行测试用例不是非常的灵活&#xff0c;有时候我需要改一两个参数添加一些日志&#xff0c;都需要重新打包部署&#xff0c;虽然自动化构建比较方便&…

vscode debug skills

1) VSCode 调试 C/C 代码时&#xff0c;如何显示动态分配的指针数组。 创建一个动态分配的一维数组: int n 10; int *array (int *)malloc(n*sizeof(int)); memset(array, 1, n*sizeof(int)); 如果直接 Debug 时查看 array 指针&#xff0c;并不能看到数组所有的值。 查看…

从用户角度出发,如何优化大数据可视化体验|北京蓝蓝UI设计公司

作者&#xff1a;蓝蓝设计-鹤鹤 大数据已经成为人们探索世界的新工具。但是&#xff0c;对于普通用户而言&#xff0c;大数据往往比较抽象和难以理解&#xff0c;因此&#xff0c;大数据可视化作为一种非常有效的工具工具被广泛应用。然而&#xff0c;在实际应用中&#xff0c…

【Java笔试强训】Day8(WY20 两种排序方法、HJ108 求最小公倍数)

WY20 两种排序方法 链接&#xff1a;两种排序方法 题目&#xff1a; 考拉有n个字符串字符串&#xff0c;任意两个字符串长度都是不同的。考拉最近学习到有两种字符串的排序方法&#xff1a; 1.根据字符串的字典序排序。例如&#xff1a; “car” < “carriage” < “c…

pycharm安装教程-pycharm安装详细步骤(Mac版)

之前跟大家讲了怎么安装Python&#xff0c;这期跟大家介绍个很好用的编程工具–pycharm。 PyCharm是一种Python IDE&#xff0c;带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具&#xff0c;比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单…

Azure 机器学习 - 使用无代码 AutoML 训练分类模型

了解如何在 Azure 机器学习工作室中使用 Azure 机器学习自动化 ML&#xff0c;通过无代码 AutoML 来训练分类模型。 此分类模型预测某个金融机构的客户是否会认购定期存款产品。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管…