摘要:前言从今天开始进入基础的复习,可能一个星期会有一篇的十道简单算法,我写博文的未必都是正确的如果有写错的地方请大家多多包涵并指正今天要复习的是泛型,泛型在中也是个很重要的知识点,本文主要讲解基础的概念,并不是高深的知识,如果基础好的同学可以当
前言
从今天开始进入Java基础的复习,可能一个星期会有一篇的<十道简单算法>,我写博文的未必都是正确的~如果有写错的地方请大家多多包涵并指正~
今天要复习的是泛型,泛型在Java中也是个很重要的知识点,本文主要讲解基础的概念,并不是高深的知识,如果基础好的同学可以当复习看看~
一、什么是泛型?Java泛型设计原则:只要在编译时期没有出现警告,那么运行时期就不会出现ClassCastException异常.
泛型:把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型
参数化类型:
把类型当作是参数一样传递
<数据类型> 只能是引用类型
相关术语:
ArrayList
ArrayList
整个称为ArrayList
整个ArrayList
早期Java是使用Object来代表任意类型的,但是向下转型有强转的问题,这样程序就不太安全
首先,我们来试想一下:没有泛型,集合会怎么样
Collection、Map集合对元素的类型是没有任何限制的。本来我的Collection集合装载的是全部的Dog对象,但是外边把Cat对象存储到集合中,是没有任何语法错误的。
把对象扔进集合中,集合是不知道元素的类型是什么的,仅仅知道是Object。因此在get()的时候,返回的是Object。外边获取该对象,还需要强制转换
有了泛型以后:
代码更加简洁【不用强制转换】
程序更加健壮【只要编译时期没有警告,那么运行时期就不会出现ClassCastException异常】
可读性和稳定性【在编写集合的时候,就限定了类型】
2.1有了泛型后使用增强for遍历集合在创建集合的时候,我们明确了集合的类型了,所以我们可以使用增强for来遍历集合!
//创建集合对象 ArrayList三、泛型基础 3.1泛型类list = new ArrayList<>(); list.add("hello"); list.add("world"); list.add("java"); //遍历,由于明确了类型.我们可以增强for for (String s : list) { System.out.println(s); }
泛型类就是把泛型定义在类上,用户使用该类的时候,才把类型明确下来....这样的话,用户明确了什么类型,该类就代表着什么类型...用户在使用的时候就不用担心强转的问题,运行时转换异常的问题了。
在类上定义的泛型,在类的方法中也可以使用!
/* 1:把泛型定义在类上 2:类型变量定义在类上,方法中也可以使用 */ public class ObjectTool{ private T obj; public T getObj() { return obj; } public void setObj(T obj) { this.obj = obj; } }
测试代码:
用户想要使用哪种类型,就在创建的时候指定类型。使用的时候,该类就会自动转换成用户想要使用的类型了。
public static void main(String[] args) { //创建对象并指定元素类型 ObjectTool3.2泛型方法tool = new ObjectTool<>(); tool.setObj(new String("钟福成")); String s = tool.getObj(); System.out.println(s); //创建对象并指定元素类型 ObjectTool objectTool = new ObjectTool<>(); /** * 如果我在这个对象里传入的是String类型的,它在编译时期就通过不了了. */ objectTool.setObj(10); int i = objectTool.getObj(); System.out.println(i); }
前面已经介绍了泛型类了,在类上定义的泛型,在方法中也可以使用.....
现在呢,我们可能就仅仅在某一个方法上需要使用泛型....外界仅仅是关心该方法,不关心类其他的属性...这样的话,我们在整个类上定义泛型,未免就有些大题小作了。
定义泛型方法....泛型是先定义后使用的
//定义泛型方法.. publicvoid show(T t) { System.out.println(t); }
测试代码:
用户传递进来的是什么类型,返回值就是什么类型了
public static void main(String[] args) { //创建对象 ObjectTool tool = new ObjectTool(); //调用方法,传入的参数是什么类型,返回值就是什么类型 tool.show("hello"); tool.show(12); tool.show(12.5); }3.3泛型类派生出的子类
前面我们已经定义了泛型类,泛型类是拥有泛型这个特性的类,它本质上还是一个Java类,那么它就可以被继承
那它是怎么被继承的呢??这里分两种情况
子类明确泛型类的类型参数变量
子类不明确泛型类的类型参数变量
3.3.1子类明确泛型类的类型参数变量泛型接口
/* 把泛型定义在接口上 */ public interface Inter{ public abstract void show(T t); }
实现泛型接口的类.....
/** * 子类明确泛型类的类型参数变量: */ public class InterImpl implements Inter3.3.2子类不明确泛型类的类型参数变量{ @Override public void show(String s) { System.out.println(s); } }
当子类不明确泛型类的类型参数变量时,外界使用子类的时候,也需要传递类型参数变量进来,在实现类上需要定义出类型参数变量
/** * 子类不明确泛型类的类型参数变量: * 实现类也要定义出类型的 * */ public class InterImpl implements Inter { @Override public void show(T t) { System.out.println(t); } }
测试代码:
public static void main(String[] args) { //测试第一种情况 //Interi = new InterImpl(); //i.show("hello"); //第二种情况测试 Inter ii = new InterImpl<>(); ii.show("100"); }
值得注意的是:
实现类的要是重写父类的方法,返回值的类型是要和父类一样的!
类上声明的泛形只对非静态成员有效
3.4类型通配符为什么需要类型通配符????我们来看一个需求.......
现在有个需求:方法接收一个集合参数,遍历集合并把集合元素打印出来,怎么办?
按照我们没有学习泛型之前,我们可能会这样做:
public void test(List list){ for(int i=0;i上面的代码是正确的,只不过在编译的时候会出现警告,说没有确定集合元素的类型....这样是不优雅的...
那我们学习了泛型了,现在要怎么做呢??有的人可能会这样做:
public void test(List
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/68891.html
摘要:往期第一课体验第二课基础类型和入门高级类型第三课泛型第四课解读高级类型插一课本来打算接着上节课把高级类型都讲完但是写着写着我发现高级类型中有很多地方都需要泛型的知识那么先插一节泛型什么是类型变量和泛型变量的概念我们都知道可以表示任意数据类型 往期 第一课, 体验typescript 第二课, 基础类型和入门高级类型 第三课, 泛型 第四课, 解读高级类型 插一课 本来打算接着上节课, ...
摘要:前言由于写的文章已经是有点多了,为了自己和大家的检索方便,于是我就做了这么一个博客导航。 前言 由于写的文章已经是有点多了,为了自己和大家的检索方便,于是我就做了这么一个博客导航。 由于更新比较频繁,因此隔一段时间才会更新目录导航哦~想要获取最新原创的技术文章欢迎关注我的公众号:Java3y Java3y文章目录导航 Java基础 泛型就这么简单 注解就这么简单 Druid数据库连接池...
摘要:然而中的泛型使用了类型擦除,所以只是伪泛型。总结本文介绍了泛型的使用,以及类型擦除相关的问题。一般情况下泛型的使用比较简单,但是某些情况下,尤其是自己编写使用泛型的类或者方法时要注意类型擦除的问题。 简介 Java 在 1.5 引入了泛型机制,泛型本质是参数化类型,也就是说变量的类型是一个参数,在使用时再指定为具体类型。泛型可以用于类、接口、方法,通过使用泛型可以使代码更简单、安全。然...
摘要:首先,我们来按照泛型的标准重新设计一下类。注意参数为而不是泛型。利用形式的通配符,可以实现泛型的向上转型,来看例子。需要注意的是,无法从这样类型的中取出数据。showImg(https://user-gold-cdn.xitu.io/2019/5/17/16ac3bf3eb16160c); 00、故事的起源 二哥,要不我上大学的时候也学习编程吧?有一天,三妹突发奇想地问我。 你确定要做一名...
阅读 3399·2021-10-08 10:15
阅读 5439·2021-09-23 11:56
阅读 1466·2019-08-30 15:55
阅读 444·2019-08-29 16:05
阅读 2724·2019-08-29 12:34
阅读 2036·2019-08-29 12:18
阅读 913·2019-08-26 12:02
阅读 1650·2019-08-26 12:00