01泛型入门

tech2025-03-01  14

文章目录

1 泛型引入2 自定义泛型3 泛型使用的几个问题4 泛型类的继承1 子类不保留父类的泛型2 指定具体的类型3 部分保留4 全部保留 5 泛型方法

1 泛型引入

泛型概念

在允许定义类,接口的时候通过一个标识表示类中某个属性的类型或者某个方法的返回值或者参数类型。这个类型参数将会在使用的时候(比如,继承这个类或者实现这个接口,用这个类型声明变量,创建对象)确定(即传入实际的类型参数,也称之为类型实参)

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; } } 泛型结构 泛型类泛型接口泛型方法

2 自定义泛型

package study.wyy.java.fanxing.demo01; /** * @author wyaoyao * @data 2020-09-04 08:41 */ 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; } }

测试

@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()); }

3 泛型使用的几个问题

异常类Exception不能使用泛型,编译就会报错 /** * @author wyaoyao * @data 2020-09-04 08:48 */ public class MyException<T> extends Exception { } 静态方法不能使用泛型,编译就会报错 package study.wyy.java.fanxing.demo01; import org.junit.Test; /** * @author wyaoyao * @data 2020-09-04 08:41 */ 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){ } @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()); } }

4 泛型类的继承

1 子类不保留父类的泛型

没有类型,泛型擦除

/** * @author wyaoyao * @data 2020-09-04 08:53 */ public class Son1 extends Father { }

等价于

public class Son1 extends Father<Object,Object> { }

2 指定具体的类型

/** * @author wyaoyao * @data 2020-09-04 08:53 */ public class Son2 extends Father<String,Integer> { @Test public void test(){ Son2 son2 = new Son2(); son2.setK("123"); son2.setV(123); System.out.println(son2.getK()); System.out.println(son2.getV()); } }

3 部分保留

/** * @author wyaoyao * @data 2020-09-04 08:53 */ public class Son3<K> extends Father<K,Long> { @Test public void test(){ Son3<String> son3 = new Son3(); son3.setK("123"); son3.setV(123L); System.out.println(son3.getK()); System.out.println(son3.getV()); } }

4 全部保留

public class Son4<K,V> extends Father<K,V> { @Test public void test(){ Son4<String,Long> son3 = new Son4(); son3.setK("123"); son3.setV(123L); System.out.println(son3.getK()); System.out.println(son3.getV()); } }

5 泛型方法

泛型方法和泛型类没有有任何关系。

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; } }
最新回复(0)