详解 泛型 与 自动拆装箱
2020-02-29 16:03:50来源:博客园 阅读 ()
详解 泛型 与 自动拆装箱
目录
- 泛型:
- 自动拆装箱:
泛型:
首先,本人来介绍一下什么是泛型:
泛型概述:
是一种把类型明确的工作 推迟到创建对象
或者 调用方法的时候才去 明确的特殊的类型。
参数化类型,把类型当作参数一样的传递。
通俗一点来讲:泛型 是JAVA 中一种十分强大的机制,因为它能够完成在未知元素类型的情况下对元素进行操作。
但是,泛型只在编译阶段有效,即在编译过程中,程序会正确的检验泛型结果。而编译成功后,*.class 文件是不包含任何泛型信息的(这就是JVM 的泛型擦除机制)
并且,泛型类只能在子类或者父类被调用。
那么,本人再来讲解一下使用泛型的好处:
泛型的好处:
(1): 把运行时期的问题提前到了编译期间
(2): 避免了强制类型转换
(3):优化了程序设计,解决了黄色警告线
------------------------------------------------------------
注意:泛型只在编译期有效 但在运行期就擦除了
(至于泛型擦除机制,本人将在后续的博文中提到,并且对于这个机制,本人也提出了相应的解决方法,希望同学们对此加以注意!!!)
现在,本人来讲解一下有关 泛型的基本格式:
泛型类 -------- 权限修饰符(public...) class 类名<泛型类型1,…>
泛型方法 ----- 权限修饰符(public...) <泛型类型> 返回类型 方法名(泛型类型 变量名)
泛型变量 ----- 权限修饰符(public...) 泛型类型 变量名
泛型接口 ----- public interface 接口名<泛型类型>
此外,本人要讲解一个关于泛型,极为重要的一个知识点——通配符
A:泛型通配符<?> ------ 任意类型,如果没有明确,那么就是Object以及任意的Java类了
B:? extends E ---------- 向下限定,E及其子类
C:? super E ------------ 向上限定,E及其父类
那么,本人在这里来通过一个例子来展示一下有关 泛型的通配符的基本用法:
现在,本人用本人《详解 继承(上)—— 工具的抽象与分层》中所创建的Grandfather类,Parent类 和 Child类来展示下通配符的 正确用法:
package com.youzg.study;
import java.util.ArrayList;
public class AboutGeneric1 {
public static void main(String[] args) {
ArrayList<Parent> people = new ArrayList<Parent>();
ArrayList<Child> people2 = new ArrayList<Child>();
//? 泛型统配符
ArrayList<?> people3 = new ArrayList<Child>();
ArrayList<?> people4 = new ArrayList<Parent>();
//向上限定
ArrayList<? super Parent> people5 = new ArrayList<Parent>();
ArrayList<? super Parent> people6 = new ArrayList<Grandfather>();
// ArrayList<? super Parent> people7 = new ArrayList<Child>(); 报错
//向下限定
ArrayList<? extends Parent> people8 = new ArrayList<Parent>();
ArrayList<? extends Parent> people9 = new ArrayList<Child>();
// ArrayList<? extends Parent> people1 = new ArrayList<Grandfather>(); 报错
}
}
本人再来举一个例子,因为在之前的博文中已经讲到过“数组”的知识了,所以我们加入要对未知类型的数组进行“逆序”操作,那么,代码如下:
package com.mec.study;
public class AboutGeneric {
public static <T>T[] revArray(T[] m) {
T temp;
for(int i=0; i<m.length/2; i++) {
temp = m[i];
m[i] = m[m.length-i-1];
m[m.length-i-1] = temp;
}
return m;
}
}
现在,本人对上述代码进行一下解释:
在方法 返回值类型(即T[]) 前出现的
而这种类类型的具体情况,要等到方法被调用时,再根据实参具体类型进行判定。
这里要特别提醒的一点是:泛型只能是类类型!
利用泛型,我们也可以来定义泛型类,代码如下:
package com.mec.study;
public class MyGeneric<T> {
private T member;
public MyGeneric() {
}
public MyGeneric(T member) {
this.member = member;
}
public T getNumber() {
return member;
}
}
那么,我们将泛型定义下来,如何去使用呢?
下面,本人通过一段代码,来展示下 定义好的泛型 的用法:
package com.mec.study;
public class DemoGeneric {
public static void main(String[] args) {
System.out.println(new MyGeneric<Integer> (1024).getNumber());
}
}
展示下运行结果:
对于上述代码,可能有同学会有疑问,什么是Interger?
我们接下来介绍下这篇博文的第二个主题——自动拆装箱:
自动拆装箱:
在第一篇博文中,本人就提到过,Java中存在八大基本类型,分别是:
byte、char、short、int、long、float、double、boolean
那么,与之相对应的,Java也提供了8种类类型:
Byte、Character、Short、Integer、Long、Float、Double、Boolean
现在的Java,增加了“自动拆箱 和 自动装箱”功能。
而所谓的“自动拆箱 和 自动装箱”,
就是例如:
在需要时,JVM自动将 int类型的变量 转换为 Integer的对象,反之亦然。
讲到这里,这篇博文的全部内容就讲解完成了。
若是对上述知识点或代码有任何疑惑、意见或者建议,请在下方评论区提出,本人将尽早予以答复,觉得有所帮助的同学请留下小赞赞,谢谢!!!
原文链接:https://www.cnblogs.com/codderYouzg/p/12385906.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:Spring个人笔记
- 数据源管理 | Kafka集群环境搭建,消息存储机制详解 2020-06-11
- Java--Stream流详解 2020-06-10
- B树和B+树的插入、删除图文详解 2020-06-09
- Java笔记:数组,异常,泛型 2020-06-08
- Spring Boot 2.3 新特性优雅停机详解 2020-06-08
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash