怎么做网站转盘,企业网络营销网站设计,郑州外贸网站推广,百度上如何发广告1. 包装类 在学习泛型前我们需要先了解一下包装类 在 Java 中#xff0c;由于基本类型不是继承自 Object #xff0c;为了在泛型代码中可以支持基本类型#xff0c; Java 给每个基本类型都对应了一个包装类型。 1.1 基本数据类型和对应的包装类
基本数据类型包装类byteByt…1. 包装类 在学习泛型前我们需要先了解一下包装类 在 Java 中由于基本类型不是继承自 Object 为了在泛型代码中可以支持基本类型 Java 给每个基本类型都对应了一个包装类型。 1.1 基本数据类型和对应的包装类
基本数据类型包装类byteByteshortShortintIntegerlongLongfloatFloatdoubleDoublecharCharacterbooleanBoolean
1.2 装箱和拆箱
装箱是把基本类型变成包装类型拆箱就是把包装类型变成基本类型。
代码示例如下
int i 10;
// 装箱操作新建一个 Integer 类型对象将 i 的值放入对象的某个属性中
Integer ii Integer.valueOf(i);
Integer ij new Integer(i);
// 拆箱操作将 Integer 对象中的值取出放到一个基本数据类型中
int j ii.intValue() 可以看到在使用过程中装箱和拆箱带来不少的代码量所以为了减少开发者的负担 java 提供了自动机制。 代码示例如下 int i 10;
Integer ii i; // 自动装箱
Integer ij (Integer)i; // 自动装箱
int j ii; // 自动拆箱
int k (int)ii; // 自动拆箱 注意 1. 在Integer这个包装类型中取得值如果在-128~127 之间可直接进行比较超过这个范围后Integer 会new 一个数值这时就进行不了比较。 2. 除了 Integer 和 Character 其余基本类型的包装类都是首字母大写。
2.泛型
2.1 概念 一般的类和方法只能使用具体的类型 : 要么是基本类型要么是自定义的类。如果要编写可以应用于多种类型的代码这种刻板的限制对代码的束缚就会很大。----- 来源《 Java 编程思想》对泛型的介绍。 泛型是在 JDK1.5 引入的新的语法通俗讲泛型 就是适用于许多许多类型 。从代码上讲就是对类型实现了参数化。 2.2 语法 1. 泛型类 类型实参 变量名 ; // 定义一个泛型类引用 class 泛型类名称 类型形参列表 { // 这里可以使用类型参数 } class ClassName T1 , T2 , ..., Tn { } class 泛型类名称 类型形参列表 extends 继承类 /* 这里可以使用类型参数 */ { // 这里可以使用类型参数 } class ClassName T1 , T2 , ..., Tn extends ParentClass T1 { // 可以只使用部分类型参数 } 2. new 泛型类 类型实参 ( 构造方法实参 ); // 实例化一个泛型类对象 举例说明实现一个类类中包含一个数组成员使得数组中可以存放任何类型的数据也可以根据成员方法返回数组中某个下标的值。
class MyArrayT {//1. 类名后的 T 代表占位符表示当前类是一个泛型类public T[] array (T[])new Object[10];//2.不能new泛型类型的数组public T getPos(int pos) {return this.array[pos];}public void setVal(int pos,T val) {this.array[pos] val;}
}
public class test{public static void main(String[] args) {MyArrayInteger myArray new MyArray();//3.类型后加入 Integer 指定当前类型myArray.setVal(0,10);myArray.setVal(1,12);int ret myArray.getPos(1);//4.不需要进行强制类型转换System.out.println(ret);// myArray.setVal(2,bit);//5.代码编译报错此时因为在注释2处指定类当前的类型此时在注释4处编译器会在存放元素的时//候帮助我们进行类型检查}
} 运行结果如下 注意 1. 泛型只能接受类所有的基本数据类型必须使用包装类 2. 【规范】类型形参一般使用一个大写字母表示常用的名称有 E 表示 Element K 表示 Key V 表示 Value N 表示 Number T 表示 Type S, U, V 等等 - 第二、第三、第四个类型 2.3 类型推导 当编译器可以根据上下文推导出类型实参时可以省略类型实参的填写例如 MyArray Integer list new MyArray (); // 可以推导出实例化需要的类型实参为 Integer 3. 裸类型 裸类型是一个泛型类但没有带着类型实参例如 MyArrayList 就是一个裸类型 MyArray list new MyArray () 注意 我们不要自己去使用裸类型裸类型是为了兼容老版本的 API 保留的机制 小结 1. 泛型是将数据类型参数化进行传递 2. 使用 T 表示当前类是一个泛型类。 3. 泛型目前为止的优点数据类型参数化编译时自动进行类型检查和转换 4. 编译——擦除机制
通过命令javap -c 查看字节码文件所有的T都是Object。 在编译的过程当中将所有的 T 替换为 Object 这种机制我们称为 擦除机制 。 Java 的泛型机制是在编译级别实现的。编译器生成的字节码在运行期间并不包含泛型的类型信息。 注意 1. 不能实例化泛型类型数组虽然 Object 是所有类的父类在编译的过程当中T替换为Object但是Object[] 不是 所有数组的父类。 原因替换后的方法为将Object[]分配给Integer[]引用程序报错。 通俗讲就是返回的Object数组里面可能存放的是任何的数据类型可能是String可能是Person运行的时候直接转给Integer类型的数组编译器认为是不安全的。
2.Java中的类型擦除并不总是把类参数 T 替换成Object而是根据泛型边界和通配符的使用情况将其替换成相应的类或接口。这种机制使得Java的泛型在编译时提供类型安全同时在运行时保持与Java 1.5之前的版本兼容。
5. 泛型的上界 在定义泛型类时有时需要对传入的类型变量做一定的约束可以通过类型边界来约束。 5.1 语法 class 泛型类名称 类型形参 extends 类型边界 { ... } 5.2 示例
示例一代码如下
class MyArrayE extends Number {}
public class test {public static void main(String[] args) {MyArrayInteger myArray1 ;// MyArrayString myArray2;}
}
运行结果如下 示例二定义一个泛型类 找到数组中的最大值
代码如下
class AlgT extends ComparableT{public T findMax(T[] array){T max array[0];for (int i 1; i array.length; i) {if (array[i].compareTo(max) 0) {max array[i];}}return max;}
}
public class test {public static void main(String[] args) {AlgInteger alg new Alg();Integer[] arr {1,2,3,4,5,6,7};System.out.println(alg.findMax(arr));}
}
运行结果如下 6. 泛型方法
6.1 定义语法 方法限定符 类型形参列表 返回值类型 方法名称(形参列表) { ... } 6.2 示例
示例一
代码如下
//静态的泛型方法 需要在static后用声明泛型类型参数
public static E void swap(E[] array, int i, int j) {
E t array[i];
array[i] array[j];
array[j] t;
}
示例二使用类型推导 示例三不使用类型推导 本文是作者学习后的总结如果有什么不恰当的地方欢迎大佬指正