(1)概述
是一种把类型明确的工作推迟到创建对象 或者调用方法的时候才去明确的特殊的类型。 参数化类型,把类型当作参数一样的传递。
(2)格式
<数据类型> 这里的数据类型只能是引用数据类型
JDK1.7之前 泛型前面后面都得写上,JDK1.7可以省略右半边不写
(3)好处
1.把运行时期的问题提前到了编译期间
避免了强制类型转换 3.优化了程序设计,解决了黄色警告线 注意:泛型只在编译期有效 但在运行期就擦除了
4.泛型可以限定,我这个集合中存储什么样的引用数据类型
(4)举例
public class Demo1 { public static void main(String[] args) { ArrayList list2 = new ArrayList(); list2.add("aaaaa"); list2.add("bbbb"); list2.add("ccc"); list2.add("ddd"); Object obj = list2.get(0); String string= (String) obj; int i=string.length(); System.out.println(i); //泛型可以避免向下转型 ArrayList<String> list3= new ArrayList(); list3.add("aaaaa"); list3.add("bbbb"); list3.add("ccc"); list3.add("ddd"); String s = list3.get(0); System.out.println(s); } }结果:
aaaaa
aaaaa
(5)泛型方法
泛型方法概述: 把泛型定义在方法上
定义格式: public <泛型类型> 返回类型 方法名(泛型类型 变量名)
public class MyTest2 { public static void main(String[] args) { MyClass<String> stringMyClass = new MyClass<>(); stringMyClass.setT("abc"); String t = stringMyClass.getT(); MyClass<Integer> integerMyClass = new MyClass<>(); integerMyClass.setT(100); Integer t1 = integerMyClass.getT(); } class MyClass<T> { //泛型<T> 我把泛型加在类上 T t; public T getT() { return t; } public void setT(T t) { this.t = t; } } }(6)泛型接口
泛型接口概述: 把泛型定义在接口上
定义格式: public interface 接口名<泛型类型>
public class MyTest3 { public static void main(String[] args) { //接口上的泛型,在你创建该接口的子类对象时,必须要明确这个泛型,具体是什么数据类型 MyDemo2<Integer, String, String> integerStringStringMyDemo2 = new MyDemo2<>(); Collection<Integer> collection=new ArrayList<Integer>(); //匿名内部类 在创建接口的子类对象时,就必须明确接口上的泛型,到底是什么类型 new MyInterface<String,String,String>(){ @Override public String show(String s, String s2) { return null; } }; } interface MyInterface<T,U,R> { //泛型接口 public R show(T t,U u); } class MyDemo2<T, U, R> implements MyInterface<T, U, R>{ @Override public R show(T t, U u) { return null; } } }