泛型:能够在类或者方法当中预支的使用未知的数据类型。java
备注:通常在建立对象的时候,将未知的数据类型肯定为具体的数据类型,当没有指定泛型时,默认类型为Object类型。框架
避免了类型转换的麻烦,存储的是什么样的数据类型,取出的就是什么样的数据类型ide
把运行期异常(代码运行以后会抛出异常)提高到编译期阶段(写代码的时候就会报错。)测试
备注:泛型它其实也是数据类型的一部分,通常咱们将类名泛型合并一块儿看作数据类型。code
泛型,用来灵活的将数据类型应用到不一样的类、方法、接口当中。将数据类型做为参数进行传递。对象
由于咱们的集合框架体系中,大量的使用了泛型继承
定义格式:接口
修饰符 class 类名<表明泛型的变量>{ }
例如:ip
public class ArrayList<E>{ public boolean add(E e){} public E get(int index){} //.... }
备注:定义的时候使用未知的泛型的变量,使用的时候(建立对象)肯定的泛型的具体类型。字符串
定义格式:
修饰符 <表明泛型的变量> 返回值类型 方法名(泛型参数){}
例如:
public class GenericMethod { // 定义带有泛型的方法 public <VIP> void show (VIP vip) { System.out.println(vip); } // 定义一个含有泛型的返回值 public <VIP> VIP show02(VIP vip) { //..... return vip; } } // 定义测试类 public class TestGenericMethod { public static void main(String[] args){ // 建立对象 GenericMethod gm = new GenericMethod(); // 调用带有泛型的方法 gm.show("abc");// VIP vip 参数 ---》形参 String str str="abc" gm.show(123);// VIP--->Integer vip = 123 gm.show2(3.14);// VIP --->Double vip=3.14 } }
定义格式:
修饰符 interface 接口名<表明泛型的变量> {}
例如:
public interface Collection<E> { public void add(E e); public Iterator<E> iterator(); } // 自定义一个泛型的接口 public interface MyGenericInterface<T> { public abstract void add(E e); public abstract E get(); //.... }
使用格式:
定义实现类时能够肯定泛型的类型
public class MyInterfaceImpl implements MyGenericInterface<String> { @Override public void add(String e) { //.... } @Override public String get(){ // .... } }
备注:此时泛型【T的值】就是String类型
始终不肯定泛型的类型,直到建立对象的时候,肯定泛型的类型
例如:
public class MyInterfaceImpl02<T> implements MyGenericInterface<T> { @Override public void add(T t) { //.... } @Override public T get(){ //...... } }
肯定泛型
/* 使用泛型 */ public class Demo04Generic { public static void main(String[] args) { MyInterface<String> my = new MyInterfaceImpl<String>(); my.add("abc"); } }
当使用泛型类或者泛型接口,传递的数据中,泛型的类型不肯定,能够经过通配符<?>表示。一旦程序当中使用泛型的通配符后,只能使用Object类中的共性的方法,集合中元素自身方法没法使用。
泛型的通配符:不知道使用什么类型来接收的时候,此时可使用?,?表明未知的通配符。
此时只能接收数据,不能往该集合当中存储数据。
代码示例:
public static void main(String[] args) { // 能够存储整数的集合 Collection<Integer> list01 = new ArrayList<Integer>(); // 此时list01能够存储整数的数据 // 展现list01集合当中的数据 getElement(list01); // 能够存储String字符串的集合 Collection<String> list02 = new ArrayList<String>(); // 此时list02能够存储字符串的数据 getElement(list02)// Collection<Object> × 不能够 // 此时若是换成泛型通配符? 就能够接收 getElement(list02);// 能够 } // 能够接收任意的数据类型 public static void getElement(Collection<?> coll){ // 只能接收Integer类型的数据 // 此时? 能够表明任意类型 }
备注:泛型不存在继承关系 Collection