目录
一:泛型简介
1.1:泛型的基本概念
泛型的本质:数据类型的占位符,泛型就是将数据类型参数化,可以像参数一样进行传入
简记:
●把类型当作参数一样进行传递
●<数据类型>只能是引用类型
1.2:泛型的好处
使用泛型的时候所有的类型转换都是由编译器完成的
●代码可读性更好(不用强制类型转换)
●程序更加安全(只要编译器没有警告,那么运行时就不会出现异常)
1.3 类型擦除
●编码时用泛型写的类型参数,编译器会在编译时期去掉,这就叫做“类型擦除”
●泛型主要用于编译阶段,在编译后生成的字节码class文件中不包含泛型中的类型信息
●涉及的类型转换仍是普通的强制类型转换,类型参数会在编译后会被替换成Object,运行时虚拟机并不知道泛型
二:泛型的使用
2.1 定义泛型
泛型字符可以是任何标识符,但是一般用E ,T, K, V, N ? 来标记
●E Element在容器中使用,代表容器中的元素
●T Typr表示普通的java类
● K Key表示建,例如:Map中的建Key
● V Valure表示值
● N Number表示数值类型
●? 表示不确定的数值类型
2.2:泛型类
●泛型类就是把泛型定义在类上,用户使用该类是才能把泛型的类型确定下来
●具体的使用方法是在类名后面添加一个或多个类型参数声明如<E>,<E,T,K,V,N>
代码
package com.gnlxy.container;
public class Generics<T> {
private T flag;
public void setFlag(T flag) {
this.flag = flag;
}
public T getFlag() {
return flag;
}
}
public class Test {
public static void main(String[] args) {
Generics<String>G=new Generics<>();
G.setFlag("王廷毕打赏");
String name=G.getFlag();
System.out.println(name);
Generics<Integer>I=new Generics<>();
I.setFlag(1000000);
Integer number=I.getFlag();
System.out.println(number);
}
}
2.3:泛型接口
泛型接口的形式和泛型类一样,但是泛型接口的具体类型要在实现类中进行声明
代码
interface Igenerics<T> {
T Getname(T name);
}
package com.gnlxy.container;
public class IgenericsImpl implements Igenerics<String> {
@Override
public String Getname(String name) {
return name;
}
}
public class Test2 {
public static void main(String[] args) {
IgenericsImpl i=new IgenericsImpl();
String name= i.Getname("陈舒畅");
System.out.println(name);
Igenerics<String>ii=new IgenericsImpl();
String num=ii.Getname("1000000");
System.out.println(num);
}
}
2.4:泛型方法
泛型方法是指将方法的参数类型定义成泛型,以便在调用时用来接收不同的类型的参数
代码
package com.gnlxy.container;
public class MethodGenerics {
public<T> void Setname (T name){
System.out.println(name);
}
public<T> T Getname(T name){
return name;
}
}
package com.gnlxy.container;
public class Test3 {
public static void main(String[] args) {
MethodGenerics M=new MethodGenerics();
M.Setname("卢鑫宇要考研!!!!");
MethodGenerics Mm=new MethodGenerics();
Integer I=Mm.Getname(6);
System.out.println(I);
}
}
静态方法
静态方法无法访问类上定义的泛型
代码
//静态方法泛型
public static <T> void SetFlag(T Flag){
System.out.println(Flag);
}
public static <T> T GetFlag(T Flag){
return Flag;
}
}
public class Test4 {
public static void main(String[] args) {
MethodGenerics.SetFlag("卢鑫宇一定能考上211!!!!!");
Integer i= MethodGenerics.GetFlag(6);
System.out.println(i);
}
}
2.5:泛型方法与可变参数
代码
public <T> void method(T...args){//可变参数 类型...形参名
for(T t:args){//增强for循环
System.out.println(t);
}
public class Test5 {
public static void main(String[] args) {
MethodGenerics methodGenerics=new MethodGenerics();
String[] arr=new String[]{"a","b","c"};
methodGenerics.method(arr);
Integer[] arr2=new Integer[]{1,2,3};
methodGenerics.method(arr2);
}
}