泛型虽好但是不能够使用多态,在使用过程中指定是什么类型就是什么类型,编译器不认可多态的使用,也就是说泛型不能够使用父类对象引用子类对象。类型系统的研究人员知道这点已一个经很久了,java的设计者发明了一种巧妙的“解决方案”,那就是使用通配符。
public static void main(String[] args){
A<Anmimal> animal=new A<Cat>();//这么写是错误的编译器会检查出来异常。提示错误信息。
}
通配符:<? extends father>、<? super child>可以使用声明类型及生命方法不能使用在类上。?可以接受泛型的任意类型,只能接受和输出,不能进行修改。
public void run ()
{
China<?> p1=new China<Manager>();
run(China <Manager>);//这样就能达到类似多态的目的
run(p1);//这是错误的因为编译的时候看左边,虽然能给p1赋值,但是在编译过程中不能够使用未知的类型。
}
public static void run (China<? extends employee>)
{
}
注意声明时可以使用通配符但是使用时确定,不能够使用通配符。
<? extends father>表示?具有上限<? super child>表示具有下限。
嵌套使用泛型
只是声明类型的过程中使用,使用时一层层从外到内拆分。
Preson<China<Student>> p=new Person<China<Student>>();
China<Student> ct=p.ct;
Student stu=ct.student;
泛型与数组
没有泛型数组不能创建泛型数组
可以只有声明,可以使用?声明泛型数组其实没有任何的意义。
China<Student> [] ct=null;
Student<String> stu=new Studnet<String>[10];
出现错误,声明的时候可以使用但是不能使用。
China <?>[] ct2=new China<?>[10];
出现错误,不能使用泛型创建数组。
Student<?>[] stu3=new Student[10];
所以发现ArryList在使用泛型的过程中是一种巧妙的转换,而非真正是使用了泛型数组。其内部接收是用Object数组接收。