在允许定义类,接口的时候通过一个标识表示类中某个属性的类型或者某个方法的返回值或者参数类型。这个类型参数将会在使用的时候(比如,继承这个类或者实现这个接口,用这个类型声明变量,创建对象)确定(即传入实际的类型参数,也称之为类型实参)
jdk5 JAVA引入了泛型 /** * jdk以前没有泛型,list中放的就是Object */ @Test public void test1(){ ArrayList list = new ArrayList(); list.add(100); // 就会出现list中放的是不同的类型,类型不安全 list.add("Hello World"); for (Object o:list) { int a =(Integer) o; } }最后会抛出ClassCastException
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer 引入泛型 /** * 引入泛型,list中放的就是实际的泛型类型 */ @Test public void test2(){ ArrayList<Integer> list = new ArrayList(); list.add(100); // 这时候,编译的时候就提示报错 list.add("Hello World"); for (Object o:list) { int a =(Integer) o; } } 泛型结构 泛型类泛型接口泛型方法测试
@Test public void test(){ Father<String, Integer> father = new Father(); father.setK("Tom"); father.setV(11); System.out.println(father.getK()); System.out.println(father.getV()); }没有类型,泛型擦除
/** * @author wyaoyao * @data 2020-09-04 08:53 */ public class Son1 extends Father { }等价于
public class Son1 extends Father<Object,Object> { }泛型方法和泛型类没有有任何关系。
public class Father<K,V> { K k; V v; public void setK(K k){ this.k = k; } public void setV(V v){ this.v = v; } public K getK() { return k; } public V getV() { return v; } // public static void get(K k,V v){ // // } // 泛型方法 public static <E> List<E> toListFromArr(E[] arr){ ArrayList<E> objects = new ArrayList(); for (E e:arr) { objects.add(e); } return objects; } }