文章目录
- 1.概述
- 2.泛型的具体表现形式
- 3.泛型的作用
- 4.泛型示例
- 5.练习:泛型测试一
- 6.练习:泛型测试二
1.概述
泛型不是指一种具体的类型,而是说,这里有个类型需要设置,那么具体设置成什么类型,得看具体的使用;
其通常与集合一起使用,起到限制集合中元素类型的作用,集合中的泛型设置了什么类型,那么这个集合只能存这个泛型的数据;
日常开发中要注意泛型的使用,其主要作用是为了提交报错的时机,只生效在编译期检查集合的数据类型,不是泛型规定的数据类型,就报错不能通过编译;
但是在编译之后,不论是否通过编译的检查,打包之后的字节码文件中,都不会在有泛型的存在了;
在使用时需要注意,泛型只能是引用类型,比如Integer,Student等,如果在方法上使用泛型的话,必须在方法的参数列表中以及返回值的泛型类型中都进行数据类型的约束。
2.泛型的具体表现形式
我们可以观察一下,下面的代码中有什么元素是我们之前没见过的呢?
其实就是< ? >的部分,它就是泛型
泛型是(Generics)JDK1.5 的一个新特性,通常用来和集合对象一起使用
泛型概念非常重要,它是程序的增强器,它是目前主流的开发方式
其中有一些常用的简称可以使用:
3.泛型的作用
前面的概述中,其实已经做过了一些介绍,其本质就是为了提供更好的代码可读性,方便开发人员在开发时进行类型的确认。
虚拟机层面是不存在泛型这个概念的,我们可以通过泛型的语法定义<>,来约束集合中元素的类型,编译器可以在编译期根据泛型约束提供一定的类型安全检查,这样可以避免程序运行时才暴露BUG,代码的通用性也会更强。
同时,因为编译后泛型的部分会被删除,不出现在最终的源码中,所以其并不会影响JVM后续运行时的性能。
4.泛型示例
示例1 : 我们创建一个ArrayList,看到eclipse发出黄线警告,这是为什么呢?
原因:ArrayList定义时使用了泛型,在声明时需要指定具体的类型
我们把这个”<>”的方式称之为泛型,那么泛型有什么样的作用呢?就是在编译阶段检查传入的参数是否正确
有了泛型,我们可以看到要求存放的是String类型,而测试时存放的是int类型的100,所以编译器报错:
类型List的add方法要求添加的类型为String类型,int类型不匹配,不能正确存入
5.练习:泛型测试一
package partThree;
import java.util.ArrayList;
/* 本类用于泛型的入门
* 泛型的优点1*/
public class TestGeneric1 {
public static void main(String[] args) {
/* 泛型是怎么来的? 想要模拟数组的数据类型检查*/
String[] s = new String[5]; //创建一个String类型的数组,长度为5
s[0]="涛涛";
s[1]="博博";
//数组的好处:在编译的时候,就检查数据的类型,只要与数组的类型不匹配就报错,
//如果集合不加泛型,集合中的元素类型没有约束,太广泛
ArrayList list = new ArrayList();
list.add("霞霞");
list.add(666);
list.add(3.14);
list.add('a');
System.out.println(list);
/*在集合中引用泛型的概念,泛型通常和集合一起使用
这样就可以利用泛型约束集合中的元素,除此之外:
可以把报错的时机提前:只要元素的类型不匹配,在编译期就报错
而不是运行代码时才报错,向集合中添加元素时,也会自动执行类型检查*/
ArrayList<String> list2 = new ArrayList();
list2.add("雷神");
//list2.add(1);
//list2.add(5.5);
//list2.add('a');
/* 4.<type> -- 这个type的值应该怎么写?
* 需要根据集合中存入的元素类型做决定,但是type必须是引用类型,不能是基本变量类型
* 所以,8大基本类型的泛型,应该使用其对应的包装类型,比如int---Integer*/
ArrayList<Integer> list3 = new ArrayList();
}
}
6.练习:泛型测试二
package partThree;
/*本类用于测试泛型的优点2*/
public class TestGeneric2 {
public static void main(String[] args) {
//需求:打印下列数组中的所有元素
Integer[] a = {1,2,3,4,5,6,7,8,9,10};
print(a);
String[] b = {"大哥","二哥","三哥","四哥","五哥","六哥","小弟",};
print(b);
Double[] c = {6.6,6.66,6.666,6.6666};
print(c);
}
/*1.泛型可以实现更加通用高级的代码,使用E表示元素的类型是Element类型
* 可以把这个理解成与多态相似,不管传入什么类型,都可以匹配的上
* 2. 泛型方法的语法要求:如果在方法上使用泛型,必须俩处同时出现:
* 一个是方法的参数列表中的参数类型,一个是返回值前的泛型类型<E>
表示这是一个泛型的方法*/
private static <E> void print(E[] e){
for (E n : e){
System.out.println(n);
}
}
// private static void print(Integer[] a){
// //遍历数组a,打印a数组所有元素到控制台
// for (int i=0; i<a.length; i++){
// System.out.println(a[i]);
// }
// /* 高效for循环--foreach循环:
// * 语法:for(1 2 : 3){循环体}
// * 1:本轮遍历到的数据类型 2:遍历到数据的名字 3:要遍历的数据
// * 好处:比普通的for循环写法简单,效率比较高
// * 坏处:没有办法按照下标操作值,只能从头到位的遍历数据*/
// for (Integer n : a){
// System.out.println(n);
// }
// }
//
// private static void print(String[] b){
// for (String n : b){
// System.out.println(n);
// }
// }
//
// private static void print(Double[] c){
// for (Double n : c){
// System.out.println(n);
// }
//}
}