目录
泛型:
自动拆装箱:
这篇博文是本人在与师兄的讨论后, 由于这个知识点在将来的学习, 甚至在工作中, 都是特别常用, 重要的知识点, 所以, 本人单独将这个知识点拿出来作为一个章节, 来为同学们讲解这个知识点, 希望同学们能够对其重视
泛型:
首先, 本人来介绍一下什么是泛型:
泛型概述:
是一种把类型明确的工作 推迟到创建对象
或者 调用方法的时候才去 明确的特殊的类型.
参数化类型, 把类型当作参数一样的传递.
通俗一点来讲: 泛型 是 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[]) 前出现的, 说明这个方法用到泛型; 在以后的代码中, 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 的对象, 反之亦然.
来源: http://www.bubuko.com/infodetail-3447833.html