image.png
    image.png
    image.png

    1. package com.atguigu.java3;
    2. import org.junit.Test;
    3. import java.util.ArrayList;
    4. import java.util.Iterator;
    5. import java.util.List;
    6. /**
    7. * 1.通配符的使用
    8. *
    9. * 通配符: ?
    10. *
    11. * 类A是类B的父类,G<A> 和 G<B> 是没有关系的,二者共同的父类是:G<?>
    12. *
    13. * @author Dxkstart
    14. * @create 2021-05-28 11:23
    15. */
    16. public class GenericTest2 {
    17. @Test
    18. public void test1() {
    19. List<Object> list1 = null;
    20. List<String> list2 = null;
    21. List<?> list = null;
    22. list = list1;
    23. list = list2;
    24. //正确的
    25. // print(list1);
    26. // print(list2);
    27. //
    28. ArrayList<String> list3 = new ArrayList<>();
    29. list3.add("AA");
    30. list3.add("BB");
    31. list3.add("CC");
    32. list = list3;
    33. //添加(写入):对于List<?> 就不能向其内部添加数据。
    34. // list.add("EE");
    35. // list.add('?');
    36. list.add(null);//可以加null
    37. //获取(读):允许读取数据,读取的数据类型为Object。
    38. Object o = list.get(0);
    39. System.out.println(o);
    40. }
    41. public void print(List<?> list) {
    42. Iterator<?> iterator = list.iterator();
    43. while (iterator.hasNext()) {
    44. Object obj = iterator.next();
    45. System.out.println(obj);
    46. }
    47. }
    48. /*
    49. 3.有限制条件的通配符的使用
    50. ? extends A:
    51. G<? extends A> 可以作为G<A> 和 G<B>的父类,其中B是A的子类
    52. ? super A:
    53. G<? super <A> 可以作为G<A> 和 G<B>的父类,其中B是A的父类
    54. */
    55. @Test
    56. public void test2(){
    57. List<? extends Person> list1 = null;//大于等于Person
    58. List<? super Person> list2 = null;//小于等于Person
    59. List<Student> list3 = new ArrayList<Student>();
    60. List<Person> list4 = new ArrayList<Person>();
    61. List<Object> list5 = new ArrayList<Object>();
    62. list1 = list3;
    63. list1 = list4;
    64. // list1 = list5;
    65. // list2 = list3;
    66. list2 = list4;
    67. list2 = list5;
    68. //读取数据
    69. list1 = list4;
    70. Person p = list1.get(0);
    71. //编译不通过
    72. // Student s = list1.get(0);
    73. list2 = list4;
    74. Object object = list2.get(0);
    75. //编译不通过
    76. // Person p = list2.get(0);
    77. //写入数据
    78. //编译不通过
    79. // list1.add(new Student());
    80. list2.add(new Person());
    81. list2.add(new Student());
    82. }
    83. }