A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. ##三、引用数据类型的自定义复杂对象

  2. 2 先建立一个Person
  3. 3 再建立一个Student继承Person
  4. 4 ArrayList<Person> al = new ArrayList<Student>();
  5. 左边声明本集合是接受Person的,但是右边只传了Student,
  6. 同时在语法上下面如果调用add()方法添加了Person类的子类对象Worker也是可以的,
  7. 但是这就出现了安全问题!
  8. 因为在Student集合中竟然出现了Worker,这就产生了严重的安全问题!
  9. 所以:编译无法通过,左右两边类型不一致!
  10. 编译时候会给出这样的提示:
  11.                 ^
  12.   需要: ArrayList<Person>
  13.   找到: ArrayList<Student>
  14.   原因: 无法通过方法调用转换将实际参数ArrayList<Student>转换为ArrayList<Person>
  15. 1 个错误



  16. ##四、泛型没有使用限定范围
  17. ```
  18. import java.util.*;
  19. class GenericDemo6
  20. {
  21.         public static void main(String[] args)
  22.         {
  23.                 ArrayList<Person> al = new ArrayList<Person>();
  24.                 al.add(new Person("abc1"));
  25.                 al.add(new Person("abc2"));
  26.                 al.add(new Person("abc3"));
  27.                 //printColl(al);

  28.                 ArrayList<Student> al1 = new ArrayList<Student>();
  29.                 al1.add(new Student("abc--1"));
  30.                 al1.add(new Student("abc--2"));
  31.                 al1.add(new Student("abc--3"));
  32.                 printColl(al1); //ArrayList<Person> al = new ArrayList<Student>();错误:左右两边类型不一致,怎么解决呢?<? extends Person>
  33.         }

  34.         public static void printColl(ArrayList<Person> al)
  35.         {
  36.                 Iterator<Person> it = al.iterator();

  37.                 while(it.hasNext())
  38.                 {
  39.                         System.out.println(it.next().getName());
  40.                 }
  41.         }
  42. }

  43. class Person
  44. {
  45.         private String name;
  46.         Person(String name)
  47.         {
  48.                 this.name = name;
  49.         }
  50.         public String getName()
  51.         {
  52.                 return name;
  53.         }
  54. }

  55. class Student extends Person
  56. {
  57.         Student(String name)
  58.         {
  59.                 super(name);
  60.         }

  61. }
  62. ```


  63. 如果想让左右两边不一致,同时还能通过编译,并且没有安全隐患,该怎么解决呢??
  64. 使用<? extends Person>可以接受Person和Person的子类型

  65. 这就是泛型的限定。


  66. ##五、使用了泛型限定上限
  67. ```
  68. import java.util.*;
  69. class GenericDemo6
  70. {
  71.         public static void main(String[] args)
  72.         {
  73.                 ArrayList<Person> al = new ArrayList<Person>();
  74.                 al.add(new Person("abc1"));
  75.                 al.add(new Person("abc2"));
  76.                 al.add(new Person("abc3"));
  77.                 printColl(al);

  78.                 ArrayList<Student> al1 = new ArrayList<Student>();
  79.                 al1.add(new Student("abc--1"));
  80.                 al1.add(new Student("abc--2"));
  81.                 al1.add(new Student("abc--3"));
  82.                 printColl(al1); //ArrayList<? extends Person> al = new ArrayList<Student>();error左右两边类型不一致,怎么解决呢?<? extends Person>
  83.         }

  84.         public static void printColl(ArrayList<? extends Person> al)//能够接受Person和Person的子类对象
  85.         {
  86.                 Iterator<? extends Person> it = al.iterator();

  87.                 while(it.hasNext())
  88.                 {
  89.                         System.out.println(it.next());
  90.                 }
  91.         }
  92. }

  93. class Person
  94. {
  95.         private String name;
  96.         Person(String name)
  97.         {
  98.                 this.name = name;
  99.         }
  100.         public String getName()
  101.         {
  102.                 return name;
  103.         }

  104.         //覆盖toString
  105.         public String toString()
  106.         {
  107.                 return name;
  108.         }
  109. }

  110. class Student extends Person
  111. {
  112.         Student(String name)
  113.         {
  114.                 super(name);
  115.         }

  116. }
  117. ```


  118. 小结:
  119. <?>任意类型---?是占位符,或者叫通配符
  120. <T>固定类型
  121. <? extends T>T和T的子类。
  122.         正如本例中的<? extends Person>可以接受Person和Person的子类。
  123.         这就泛型向上限定的,上面是固定的,下面是可以扩展的,不确定的---上限
  124. <? super T>T和T的父类。
  125.         <? super Student>可以接受Student和Student的父类。
  126.         这就是泛型向下限定的,下面是固定的,上面是可以扩展的,不确定的---下限
  127.         当然啦,在本例中是不可以使用下限限定泛型的,因为Object是不具备getName()方法的。
复制代码


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马