Java泛型
2021-06-30 本文已影响0人
情安
1.介绍
public class LinkedList<E>中的<E>它就叫泛型,常用来和集合对象一同使用,所以我们在开始学习集合之前,必须先了解下什么是泛型。而且泛型概念非常重要,它是程序的增强器,它是目前主流的开发方式。
泛型是(Generics)JDK1.5 的一个新特性,其实就是一个『语法糖』,本质上就是编译器为了提供更好的可读性而提供的一种小手段,小技巧,虚拟机层面是不存在所谓『泛型』的概念的。 通过泛型的语法定义,约束集合元素的类型,编译器可以在编译期提供一定的类型安全检查,避免运行时才暴露bug,代码通用性更强。泛型可以提升程序代码的可读性,但它只是一个语法糖(编译后这样的东西就被删除,不出现在最终的源代码中),对于JVM运行时的性能是没有任何影响的。
2.泛型声明和常用名称
2.1声明
泛型可以在接口/类、方法上使用:
java.util.List泛型接口/类:
public interface Collection<E> {}
public class TestC<QQ> {}
泛型方法的声明:
public <E> void print(E e) {}
在方法返回值前声明了一个<E>表示后面出现的E是泛型,而不是普通的java变量。
2.2常用名称
<E> - Element (在集合中使用,因为集合中存放的是元素)
<T> - Type(Java 类)
<K> - Key(键)
<V> - Value(值)
<N> - Number(数值类型)
<?> - 表示不确定的java类型
3用途:编译时类型检查
package cn.tedu.generic;
import java.util.ArrayList;
import java.util.List;
//这个类用来测试泛型的好处
public class Test3_Generic {
public static void main(String[] args) {
//1、泛型是怎么来的?--想要模拟数据的数据类型检查
String[] a = new String[5];
a[2]="jack";
a[4]="rose";
//数组的好处:在编译时期检查数据的类型,如果不是要求的类型会在编译期就报错
// a[0]=90;
// a[1]='a';
// a[3]=9.9;
//2、泛型通常会结合着集合一起使用
List list = new ArrayList();
//没有泛型,数据类型根本没有约束 --太自由!!!
list.add(10);//可以加整型
list.add(8.8);//可以加浮点型
list.add('a');//可以加字符
list.add("tony");//可以加字符串
System.out.println(list);
//3、泛型来了--主要想约束集合中元素的类型<?>
List<String> list2 = new ArrayList();
//4、泛型好处:可以把报错时机提前,在编译期就报错,而不是在运行后抛出异常
//泛型好处:在向集合中添加元素时,会先检查元素的数据类型,不是要求的类型就编译失败
list2.add("tony");//可以加字符串
// list2.add(10);
// list2.add(8.8);
// list2.add('a');
//5、<type>--type的值到底怎么写?要看的要存放的数据的类型是啥,type必须是引用类型不能是基本类型
// List<int> list3 = new ArrayList();//不许出现int这种基本类型
List<Integer> list3 = new ArrayList();
list3.add(100);
list3.add(200);
// list3.add("300");
}
}
4.用途:代码通用性更强
传统方式通过重载多态实现,方法同名,参数类型不同。
package cn.tedu.generic;
//这个类用来测试泛型的好处
public class Test4_Generic2 {
public static void main(String[] args) {
//打印数组中的元素
Integer[] a = {1,2,3,4,5};
print(a);
String[] b = {"tony","jack","rose","xiongda","xionger"};
print(b);
Double[] c = {1.1,2.2,3.3};
print(c);
}
public static void print(Double[] y) {
for (Double d : y) {
System.out.println(d);
}
}
public static void print(Integer[] x) {
// 高效for循环/foreach循环 好处是:比普通for循环的效率高,语法简介 坏处是:没法按照下标获取值
//for(1 2 : 3){} --3是要遍历的数据 1是遍历得到的数据的类型 2是变量名
for(Integer m: x){
System.out.println(m);
}
}
public static void print(String[] z) {
for (String s : z) {
System.out.println(s);
}
}
}
泛型方式
package cn.tedu.generic;
//这个类用来测试泛型的好处
public class Test4_Generic2 {
public static void main(String[] args) {
//打印数组中的元素
Integer[] a = {1,2,3,4,5};
String[] b = {"tony","jack","rose","xiongda","xionger"};
Double[] c = {1.1,2.2,3.3};
print(a);
print(b);
print(c);
}
//1、泛型可以实现通用代码的编写,使用E表示元素的类型是Element类型 -- 理解可以神似多态
//2、泛型的语法要求:如果在方法上使用泛型,必须两处同时出现,一个是参数一个是返回值前的泛型
public static <E> void print(E[] y) {
for (E d : y) {
System.out.println(d);
}
}
}