在没有泛型之前,从集合中读取到的每一个对象都必须进行转换。如果不小心插入了错误的类型,在运行时的转换处理就会出错。有了泛型之后,就可以告诉编译器每个集合中接受哪些数据类型,编译器自动为插入进行转换,并在编译时告知是否插入了类型错误的对象。
原生态类型:List // 合法,但不建议使用,只是为了兼容之前的代码
参数化类型:
List<String> // 只接受String类型的对象。String也可以是其他任意的类型
List<Object> // 可以接受任意类型的对象,因为Object是所有类的父类
无限制通配类型:List<?>
原生态类型逃避了类型检查,可以将任意类型的对象放入原生态类型的集合中。参数化类型则明确告知编译器集合可以接受的对象类型。
泛型有子类型化的规则,List<String>是原生态类型List的一个子类型,而不是参数化类型List<Object>的子类型。例如,如果一个方法的参数是List类型,则调用该方法时传递List<String>是可以的,而传递List<String>就会报错。
总结:不要使用原生态类型。