『Java』泛型

    技术2022-07-11  85

    泛型是一种未知的数据类型,当我们不知道使用什么数据类型的时候,可以使用泛型

    泛型也可以看做是一个变量,用来接收数据类型

    1. 泛型类

    定义格式:

    修饰符 class 类名<代表泛型的变量> {}

    例如ArrayList:

    class ArrayList<E> { public boolean add(E e){} public E get(int index){} ... }

    使用的时候要:

    ArrayList<Integer> ary = new ArrayList<Integer>(); // 后面使用类方法E必须是Integer类型

    2. 泛型方法

    定义格式:

    修饰符 <泛型> 返回值类型 方法名(使用泛型单位参数列表){ // 方法体 }

    例如:

    public class Demo { public <T> void func(T t){ System.out.println(t); } }

    使用时:

    public class Test { public static void main(String[] args) { Demo d = new Demo(); d.func("1"); // 1 d.func(2); // 2 d.func(true); // true d.func(null); // null d.func(d); // 对象地址 } }

    还可以定义泛型静态方法:

    public class Demo { public static <T> void func(T t){ System.out.println(t); } }

    使用时:

    public class Test { public static void main(String[] args) { Demo.func("1"); // 1 Demo.func(2); // 2 Demo.func(true); // true Demo.func(null); // null } }

    3. 泛型接口

    泛型类:

    public interface Demo<T> { public abstract void method(T t); }

    方式一

    public class DemoImpl implements Demo<String>{ @Override public void method(String s) { System.out.println(s); } } // -------------------------------------------------------- public class Test { public static void main(String[] args) { DemoImpl d = new DemoImpl(); d.method("hello"); // hello } }

    方式二

    public class DemoImpl<K, V> implements Demo<K> { public void method(K k,V v) { System.out.println(k); System.out.println(v); } @Override public void method(K k) { System.out.println(k); } } // --------------------------------------------------------- public class Test { public static void main(String[] args) { DemoImpl<String,Integer> d = new DemoImpl<>(); d.method("hello"); // hello d.method("1",1); // 1 1 } }

    此处可以看出两点:

    实现接口时,泛型标识符可以不一样(最好一致),但是数量要一致实现类或子类中,仍然可以增加自己类中特有的泛型

    4. 泛型通配符

    当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。

    4.1 基本使用

    此时只能接收数据,不能往该集合中存储数据,不能创建对象时使用

    例如遍历一个ArrayList,无论其什么类型

    import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Test { public static void main(String[] args) { List<Integer> list1 = new ArrayList<>(); list1.add(1); list1.add(2); List<String> list2 = new ArrayList<>(); list2.add("Hello"); list2.add("world"); show(list1); // 1 2 show(list2); // hello world } public static void show(List<?> list){ Iterator<?> it = list.iterator(); while (it.hasNext()){ Object o = it.next(); System.out.println(o); } } }

    4.2 受限泛型

    之前设置的泛型可以使任意类型,但是Java中的泛型可以指定一个泛型的上限和下限

    泛型的上限 格式:<? extends 类>意义:只能接收该类型及其子类 泛型的下限 格式:<? super 类>意义:只能接收该类型及其父类

    5. 类型擦除

    泛型的类型限定只存在于编译期,编译之后,进入JVM之前,泛型信息会被擦除

    Processed: 0.014, SQL: 9