泛型就是参数化类型,把类型作为可传递参数 常见形式有:泛型类、泛型接口、泛型方法 语法:类名<T> (可以写多个,中间用逗号隔开) 有以下几种常用泛型类型变量
E:元素(Element)K:关键字(Key)N:数字(Number)T:类型(Type)V:值(Value)好处:
提高代码的重用性防止类型转换异常,提高代码的安全性个人感觉实际作用就是为了限制参数类型,保证参数类型都一致 在实例化的时候,Generic<String> generic=new Generic();你给泛型限制的什么类型; 后面的方法或者变量都按照这个类型传递; 除非再实例一个对象传递不同的类型。
(注意)泛型只允许使用引用类型
接口
public interface MyInterface<T> { void show(T t); }实现类 实现的时候不指定接口的泛型类型(将实现类变成泛型类)
public class MyInterfaceImpl<T> implements MyInterface<T>{ public void show(T t) { System.out.println(t); } @Test public void Test(){ MyInterface myInterface=new MyInterfaceImpl<String>(); myInterface.show("通过泛型类来先不指明是什么类型"); } }实现的时候指定泛型类型
public class MyInterfaceImpl implements MyInterface<String>{ public void show(String t) { System.out.println(t); } @Test public void Test(){ MyInterface myInterface=new MyInterfaceImpl(); myInterface.show("直接指定泛型类型"); } }从这里可以很明显的体现出代码重用性,实现了类似重载的功能、代码量也减少了。
public class GenericMethod { public <T> T show(T t){ System.out.println(t); return t; } @Test public void Test(){ GenericMethod genericMethod =new GenericMethod(); genericMethod.show("我输入的是什么类型的值,这个泛型就是什么类型"); genericMethod.show(100); genericMethod.show(3.14); } }参数化类型、类型安全的集合,强制要求集合元素的类型一致。 特点:
编译时即可检查,而非运行时抛出异常访问时不必类型转换(拆装箱)不同类型的泛型之间不能相互赋值,泛型不存在多态不使用泛型集合,添加不同类型的元素遍历的时候进行类型转换会发生异常
public void Test(){ ArrayList arrayList=new ArrayList(); arrayList.add(10); arrayList.add("张三"); //使用循环遍历想进行类型转换的时候,会发生转换异常 for (Object o : arrayList) { System.out.println((String) o); } }使用泛型集合则在你添加不同类型元素的时候会直接报红
public void Test(){ ArrayList<String> list =new ArrayList<String>(); list.add("张三"); list.add("李四"); //如果添加的元素类型不一样,会直接报红 //list.add(100); }