一、类型通配符
当声明一个方法时,某个形参的类型是一个泛型类或泛型接口类型,但是在声明方法时,又不确定该泛型实际类型,可以考虑使用类型通配符。
先来看下面一个案例
import java.util.ArrayList; import java.util.List; /* 泛型中通配符 常用的 T,E,K,V,? ?*通配符,表示不确定的 java 类型,代表任意类型,有位置有求 需要传入具体类型的位置,不能单独使用 声明,泛型类,泛型接口,泛型方法时不能单独使用 T (type) 表示具体的一个java类型 K V (key value) 分别代表java键值中的Key Value E (element) 代表Element 上界通配符 < ? extends E> 传入的类型,可以是当前类型以及当前类型的孩子 下界通配符 < ? super E> 传入的类型,可以使当前类型,也可以是当前类型的父类 ?和 T 的区别 * */ public class Demo1 { public static void main(String[] args) { List<String> list1 = new ArrayList<>(); list1.add("项羽"); list1.add("刘邦"); list1.add("张饵"); test1(list1); } public static void test1(List c){ for (int i = 0; i <c.size() ; i++) { System.out.println(c.get(i)); } } }
上面的方法执行是没有问题的,但是此处使用 List 接口时没有传入实际类型参数,这将引起泛型警告。如何消除这个警告呢?
方式一:
public class Demo1 { public static void main(String[] args) { List<Object> list1 = new ArrayList<>(); list1.add("项羽"); list1.add("刘邦"); list1.add("张饵"); test1(list1); } public static void test1(List<Object> c){ for (int i = 0; i <c.size() ; i++) { System.out.println(c.get(i)); } } }
这样的形参太局限了,只能传入 List<Object> 类型的实参。
方式二:声明一个泛型方法
public class Demo1 { public static void main(String[] args) { List<String> list1 = new ArrayList<>(); list1.add("项羽"); list1.add("刘邦"); list1.add("张饵"); test1(list1); } public static<T> void test1(List<T> c){ for (int i = 0; i <c.size() ; i++) { System.out.println(c.get(i)); } } }
该方法需要声明泛型形参T。
方式三:使用类型通配符