15泛型
15.1泛型引入¶
2022年7月11日
23:45
-
不使用泛型, 在集合遍历时出现的问题 本质 1. 不能对加入到集合中的数据类型进行约束 (如向下转型时出现类型转换异常) 2. 遍历时, 需要对返回的元素进行类型转换, 影响效率 3. 本质: 元素以Object存储, 使用时需要向下转型
-
泛型的理解和好处 1. 泛型的好处 1. 编译时, 自动检查添加元素的类型, 提高了==安全性==
2. ==减少了类型转换==的次数, ==提高效率== * 不使用泛型 Dog -加入-> Object -取出-> Dog 放入到ArrayList 会先转成Object,在取出时,还需要转换成Dog * 使用泛型 Dog -> Dog -> Dog 放入取出时,不需要类型转换,提高效率
15.2泛型介绍¶
2022年7月12日
15:56
-
泛型(generic)又称参数化类型,是Jdk5.0出现的新特性, 解决数据类型的安全性问题, 是一种用来表示类型的类型
-
c++模板 与 java泛型 相似 都用到了泛型编程的思想
-
泛型的使用: 在类声明或实例化时, 指定需要的具体的类型。
-
Java泛型可以保证 如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常, 代码更加简洁、健壮
例:
-
泛型的作用: 可以在类声明时通过一个标识表示类中某个属性的类型,或者是某个方法的返回值的类型,或者是参数类型。[有点难,举例Generic03.java]
-
泛型表示的类型在==编译时期==确定
如之前使用集合时相似, 泛型类可以不指定泛型, 此时忽视泛型, 按照输入类型自动转换
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()), 那么默认给它的泛型
15.5自定义泛型类/接口/方法¶
2022年7月12日
20:59
1. 自定义泛型类¶
-
基本语法
class 类名<T, R…>{}
-
注意细节
1. 普通成员可以使用泛型(属性/ 方法)
2. 不能(直接)创建泛型数组
3. 静态方法中不能使用类的泛型
4. 泛型类的类型, 是在创建对象时确定的(因为创建对象时, 需要指定确定类型)
5. 如果在创建对象时, 没有指定泛型类型, 默认为Object
6. 静态方法中不能使用泛型(因为泛型都还没确定)
2. 自定义泛型接口¶
-
基本语法
-
注意细节 1. 接口中, 静态成员也不能使用泛型(与泛型类一样) 2. 泛型接口的类型, 在==继承接口==或者==实现接口==时确定 3. 没有指定类型, 默认为Object
3. 自定义泛型方法¶
-
基本语法
-
注意细节 1. 泛型方法可以定义在普通类中, 也可以定义在泛型类中 2. 当泛型方法调用时, 类型会被确定 (通过形参确定类型) 3. 类似
public void eat(E e) {}
的方法, 是使用了一个泛型E, 而不是泛型方法
15.6泛型的继承和通配符¶
2022年7月12日
23:59
泛型的继承和通配符说明 GenericExtends.java¶
-
泛型==不具备继承性==
List<Object> list = new ArrayList<String>0;
//Error : 不兼容的类型。实际为 java.util.ArrayList
',需要 'java.util.List ' -
<?>:可以接收任意泛型类型
- <? extends A>:接收A类以及A类的子类,规定了泛型的==上限==
- <? super A>:支持A类以及A类的父类,不限于直接父类,规定了泛型的==下限==
15.6JUnit¶
2022年7月13日
15:13
- 为什么需要Junit 1. 一个类有很多功能代码需要测试,为了测试,就需要写入到main方法中 1. 如果有多个功能代码测试,就需要来回注销,切换很麻烦 2. 如果可以==直接运行一个方法==,就方便很多,并且可以给出相关信息,就好了-> 使用JUnit
- 基本介绍 1. JUnit是一个Java语言的单元测试框架 2. 多数Java的开发环境都已经集成了JUnit作为单元测试的工具 3. 常用版本 JUNIT 5
- 使用 1. 在方法前使用注解==@Test==, 第一次使用可能需要加载包
- 注意点
1. static方法不能使用JUnit来测试
1. 单元测试时, 不能从
System.in
输入