泛型的补充理解:泛型将参数做为变量能够更灵活高效的复用功能相同的业务代码,泛型能够用Object的引用来实现参数"任意化",“任意化”带来的缺点是要作显式的强制类型转换,而这种转换是要求开发者对实际参数类型能够预知的状况下进行的。对于强制类型转换错误的状况,编译器可能不提示错误,在运行的时候才出现异常,这是自己就是一个安全隐患。
那么泛型的好处就是在编译的时候可以检查类型安全,而且全部的强制转换都是自动和隐式的。安全
这里看两个栗子:
一、定义打印一个集合元素ide
public static void print(List<?> list){ list.add("test"); //报错,这里对将来使用对类型是没法肯定对 for (Object o: list ) { System.out.println(o); } }
二、父类 Animal 和几个子类,如狗、猫等code
static int countLegs (List<? extends Animal > animals ) { int retVal = 0; for ( Animal animal : animals ) { retVal += animal.countLegs(); } return retVal; } static int countLegs1 (List< Animal > animals ){ int retVal = 0; for ( Animal animal : animals ) { retVal += animal.countLegs(); } return retVal; } public static void main(String[] args) { List<Dog> dogs = new ArrayList<>(); // 不会报错 countLegs( dogs ); // 报错 countLegs1(dogs); }
因此,对于不肯定或者不关心实际要操做的类型,可使用无限制通配符(尖括号里一个问号,即 ),表示能够持有任何类型。像 countLegs 方法中,限定了上届,可是不关心具体类型是什么,因此对于传入的 Animal 的全部子类均可以支持,而且不会报错。而 countLegs1 就不行。开发