泛型是一种未知的数据类型,当我们不知道使用什么数据类型的时候,可以使用泛型
泛型也可以看做是一个变量,用来接收数据类型
定义格式:
修饰符 class 类名<代表泛型的变量> {}例如ArrayList:
class ArrayList<E> { public boolean add(E e){} public E get(int index){} ... }使用的时候要:
ArrayList<Integer> ary = new ArrayList<Integer>(); // 后面使用类方法E必须是Integer类型定义格式:
修饰符 <泛型> 返回值类型 方法名(使用泛型单位参数列表){ // 方法体 }例如:
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 } }泛型类:
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 } }此处可以看出两点:
实现接口时,泛型标识符可以不一样(最好一致),但是数量要一致实现类或子类中,仍然可以增加自己类中特有的泛型当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。
此时只能接收数据,不能往该集合中存储数据,不能创建对象时使用
例如遍历一个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); } } }之前设置的泛型可以使任意类型,但是Java中的泛型可以指定一个泛型的上限和下限
泛型的上限 格式:<? extends 类>意义:只能接收该类型及其子类 泛型的下限 格式:<? super 类>意义:只能接收该类型及其父类泛型的类型限定只存在于编译期,编译之后,进入JVM之前,泛型信息会被擦除