跳转至

15泛型

15.1泛型引入

2022年7月11日

23:45

  1. 不使用泛型, 在集合遍历时出现的问题 本质 1. 不能对加入到集合中的数据类型进行约束 (如向下转型时出现类型转换异常) 2. 遍历时, 需要对返回的元素进行类型转换, 影响效率 3. 本质: 元素以Object存储, 使用时需要向下转型

  2. 泛型的理解和好处 1. 泛型的好处 1. 编译时, 自动检查添加元素的类型, 提高了==安全性==

      2. ==减少了类型转换==的次数, ==提高效率==
    
         * 不使用泛型
    
           Dog -加入-> Object -取出-> Dog
    
           放入到ArrayList 会先转成Object,在取出时,还需要转换成Dog
    
         * 使用泛型
    
           Dog -> Dog -> Dog
    
           放入取出时,不需要类型转换,提高效率
    

15.2泛型介绍

2022年7月12日

15:56

  1. 泛型(generic)又称参数化类型,是Jdk5.0出现的新特性, 解决数据类型的安全性问题, 是一种用来表示类型的类型

  2. c++模板 与 java泛型 相似 都用到了泛型编程的思想

  3. 泛型的使用: 在类声明或实例化时, 指定需要的具体的类型。

  4. Java泛型可以保证 如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常, 代码更加简洁、健壮

    例:

    ArrayList<Dog> list = new ArrayList<Dog>();
    list.add(new Cat); 在此处会Error, 而不是运行时异常
    
  5. 泛型的作用: 可以在类声明时通过一个标识表示类中某个属性的类型,或者是某个方法的返回值的类型,或者是参数类型。[有点难,举例Generic03.java]

  6. 泛型表示的类型在==编译时期==确定

​ 如之前使用集合时相似, 泛型类可以不指定泛型, 此时忽视泛型, 按照输入类型自动转换

15.4泛型的语法

2022年7月12日

16:45

1. 泛型的声明

```java
interface <T>{} 或 class <K, V>
```

* <font color='#EE0000'>说明</font>:

1.  其中, T, K, V代表类型
2.  任何字母都可以使用, 常用T: type, K: key, V: value

2. 泛型的实例化

*   要在类名后面指定类型参数的值(类型) 如:

    ```java
    List<String> strList = new ArrayList<Stirng> ();
    Iterator<Person> iterator = persons.iterator();
    ```

3. 泛型的使用的注意事项和细节

1. 泛型的类型只能是==引用类型==, 不能是值类型(int, double)

2. 在给泛型指定具体类型后, 可以==传入该类型或者其子类类型==

3. 泛型使用形式

List<Integer> list1 = new ArrayList<Integer>();
List<Integer> list2 = new ArrayList<> (); [简写] 编译器会自动进行类型推断

* .var也是这种形式:

 `new ArrayList<Person>().var` -> `ArrayList<Person> list2 = new ArrayList<> ();`

4. 如果不指定泛型(List list3 = new ArrayList()), 那么默认给它的泛型就是Object

15.5自定义泛型类/接口/方法

2022年7月12日

20:59

1. 自定义泛型类

  1. 基本语法

    class 类名<T, R…>{}

  2. 注意细节

    1. 普通成员可以使用泛型(属性/ 方法)

    2. 不能(直接)创建泛型数组

    3. 静态方法中不能使用类的泛型

    4. 泛型类的类型, 是在创建对象时确定的(因为创建对象时, 需要指定确定类型)

    5. 如果在创建对象时, 没有指定泛型类型, 默认为Object

    6. 静态方法中不能使用泛型(因为泛型都还没确定)

2. 自定义泛型接口

  1. 基本语法

    interface 接口名<T, R> {}
    
  2. 注意细节 1. 接口中, 静态成员也不能使用泛型(与泛型类一样) 2. 泛型接口的类型, 在==继承接口==或者==实现接口==时确定 3. 没有指定类型, 默认为Object

3. 自定义泛型方法

  1. 基本语法

    方法修饰符 <T, R> 返回类型 方法名(参数列表) {}
    
  2. 注意细节 1. 泛型方法可以定义在普通类中, 也可以定义在泛型类中 2. 当泛型方法调用时, 类型会被确定 (通过形参确定类型) 3. 类似 public void eat(E e) {} 的方法, 是使用了一个泛型E, 而不是泛型方法

15.6泛型的继承和通配符

2022年7月12日

23:59

泛型的继承和通配符说明 GenericExtends.java

  1. 泛型==不具备继承性==

    List<Object> list = new ArrayList<String>0;

    //Error : 不兼容的类型。实际为 java.util.ArrayList',需要 'java.util.List'

  2. <?>:可以接收任意泛型类型

  3. <? extends A>:接收A类以及A类的子类,规定了泛型的==上限==
  4. <? super A>:支持A类以及A类的父类,不限于直接父类,规定了泛型的==下限==

15.6JUnit

2022年7月13日

15:13

  1. 为什么需要Junit 1. 一个类有很多功能代码需要测试,为了测试,就需要写入到main方法中 1. 如果有多个功能代码测试,就需要来回注销,切换很麻烦 2. 如果可以==直接运行一个方法==,就方便很多,并且可以给出相关信息,就好了-> 使用JUnit
  2. 基本介绍 1. JUnit是一个Java语言的单元测试框架 2. 多数Java的开发环境都已经集成了JUnit作为单元测试的工具 3. 常用版本 JUNIT 5
  3. 使用 1. 在方法前使用注解==@Test==, 第一次使用可能需要加载包
  4. 注意点 1. static方法不能使用JUnit来测试 1. 单元测试时, 不能从System.in输入