(2018.02.28)
1.Java参数化类型:允许元素在创建集合时,指定集合元素的类型。(泛型Generic);
2.Java 5 后提供的泛型支持;
3.Java 7 支持菱形语法,即允许在构造器后不需要带完整的泛型信息;
4.泛型:就是允许在定义类、接口、方法时使用类型形参,这个类型形参将在声明变量、创建对象、调用方法时动态地指定(即传入实际的类型参数);
5.可以为任何类、接口增加泛型说明;
6.带泛型声明的接口、父类创建实例或派生出子类时,不能再包含类型参数;
7.不管泛型的实际类型参数是什么,它们在运行时总有相同的类,对于Java来说,它们依然被当成同一个类来处理,在内存中也只占用一块内存空间,因此在静态方法、静态初始化块或者静态变量的声明和初始化中不允许使用类型形参;
8.Java泛型设计的原则是:只要代码在编译是没有出现警告,就不会遇到运行时ClassCastException异常;
9.表示各种泛型的父类,可使用泛型通配符:(?)。Example:List<?>它的元素类型可以匹配任何类型;
10:设定通配符上限:
Example: Circle类 是 Shape子类
a.定义某参数为List<Shape>,传入List<Circle> shapes编译报错;
b.定义某参数为List<?>,传入List<Circle> shapes,里面使用Shape的方法时,还需要将实参强制转换为Shape,才可使用Shape方法,默认的是Object;
c.若定义参数为List<? extends Shape> ,传入参数
List<Circle> shapes,此时shapes不用强制转换,即可使用Shape方法;
但是?代表的是一个未知的子类,程序无法确定这个类型是什么,所以无法将任何对象添加到这种集合中;
11.定义类型形参时设置上限,用于表示传给该类型形参的实际类型要么是上限类型,要么是上限类型的子类;
12.泛型方法:泛型方法的方法签名比普通方法的方法前面多了类型参数声明,类型参数声明以尖括号括起来,多个类型形参之间以逗号(,)隔开,所有的类型形参放在方法修饰符和方法返回值类型之间。
//声明一个泛型方法,该泛型方法中带一个T类型形参
static <T> void test(Collection<T> from, Collection<T> to)
//声明一个泛型方法,该
static <T> void test(Collection<? extends T> from, Collection<T> to)
这种采用类型通配符的表示方式,只要test()方法的前一个Collection集合里的元素类型是后一个Collection集合里的元素类型的子类即可。
13.类型通配符:显示的指定类。
14.如果程序显示指定了泛型构造器中声明的类型形参的实际类型,则不可以使用"菱形"语法.
15.通配符下限:Collection<? super Type> src表示它 必须是Type本身,或者Type父类。