目录
一:泛型简介
1.1:泛型的基本概念
1.2:泛型的好处
1.3 类型擦除
二:泛型的使用
2.1 定义泛型
2.2:泛型类
代码
2.3:泛型接口
代码
2.4:泛型方法
代码
静态方法
代码
2.5:泛型方法与可变参数
代码
泛型的本质:数据类型的占位符,泛型就是将数据类型参数化,可以像参数一样进行传入
简记:
●把类型当作参数一样进行传递
●<数据类型>只能是引用类型
使用泛型的时候所有的类型转换都是由编译器完成的
●代码可读性更好(不用强制类型转换)
●程序更加安全(只要编译器没有警告,那么运行时就不会出现异常)
●编码时用泛型写的类型参数,编译器会在编译时期去掉,这就叫做“类型擦除”
●泛型主要用于编译阶段,在编译后生成的字节码class文件中不包含泛型中的类型信息
●涉及的类型转换仍是普通的强制类型转换,类型参数会在编译后会被替换成Object,运行时虚拟机并不知道泛型
泛型字符可以是任何标识符,但是一般用E ,T, K, V, N ? 来标记
●E Element在容器中使用,代表容器中的元素
●T Typr表示普通的java类
● K Key表示建,例如:Map中的建Key
● V Valure表示值
● N Number表示数值类型
●? 表示不确定的数值类型
●泛型类就是把泛型定义在类上,用户使用该类是才能把泛型的类型确定下来
●具体的使用方法是在类名后面添加一个或多个类型参数声明如<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); } }
泛型接口的形式和泛型类一样,但是泛型接口的具体类型要在实现类中进行声明
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); } }
泛型方法是指将方法的参数类型定义成泛型,以便在调用时用来接收不同的类型的参数
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); } }
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); } }