泛型的使用二

泛型虽好但是不能够使用多态,在使用过程中指定是什么类型就是什么类型,编译器不认可多态的使用,也就是说泛型不能够使用父类对象引用子类对象。类型系统的研究人员知道这点已一个经很久了,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数组接收。

猜你喜欢

转载自blog.csdn.net/qq_35681797/article/details/82118184