泛型
为什么要引入泛型?
正如上面图片所示,当我们想着遍历集合并且进行对Dog进行向下转型【因为我们遍历出来的Dog编译类型都是Object,我们不可以直接调用Dog类中包含的属性方法】
即:Object o=集合中的对象;【编译类型都是Object】
所以我们必须进行向下转型,把dog这个对象引用的编译类型和运行类型都改为 Dog才可以
但是呢?假如说我们其中在集合中不小心添加了一个猫对象,那么之后强制向下转型就会在运行之后出现异常,编译的时候编译器是不会报错的【因为输出对象的编译类型都是Object】
【因为遍历输出时Object o=集合中的对象,所以输出对象的编译类型都是Object】
泛型的好处
使用泛型之后
不使用泛型时 遍历时必须是Object
使用泛型之后,可以直接取出Dog类型而不是Object类型
泛型介绍
1.
等于说把创建对象时,指定泛型的类型传给了E
那么也就等价于下图:
把创建对象时指定的泛型String传递给了我们的Person类中的E,那么直接等价写出替换后的结果
当然,创建对象时传入的泛型类型可以任意类型。可以是String ,Integer,等等也可以是自定义类型
注意:
也就是说,设置为泛型String是在编译期间就确定了,所以创建对象时传参数传一个整形是错误的
同理:
泛型的语法
泛型练习
创建对象时,进行替换操作,我们在定义HashMap的时候,就已经把这个泛型确定了,就已经替换了
代码如下:
泛型使用注意事项及细节
1.
2.重点
第一步:
对于一个泛型,当在我们创建对象的时候就会指定一个泛型类型 A,那么类Pig的E都被进行替换
每创建一次对象,我们就可以对创建对象时传入的泛型类型进行替换操作
第二步:
当我们调用构造器传参数进行创建对象的时候,
对于第一个传参是new A(),即是 A e=new A();
对于第二个传参是new B(),即是A e=new B();
如果B不继承A,那么就不可以传参数new B()给到Pig类的构造器
4.
当使用泛型Pig之后
泛型练习![](https://i-blog.csdnimg.cn/blog_migrate/718ee7e44e250782a09a48a8175c887d.png)
总结一下这道题的细节:
1.
我们可以进行调用ArrayList的sort方法,并且可知参数类型是一个Comparator接口
我们可以传一个匿名内部类当作实现这个接口,并且重写这个接口中的抽象方法compare
源码:
2.这个泛型替换
源码:这两处都会根据指定泛型而更改
3.
把对生日方法的比较法则封装到这个MyDate类中,
即是重写这个接口中的抽象方法compareTo方法
自定义泛型
6.
因为静态方法或属性是在类加载时就进行初始化的,我们知道类加载是发生在创建对象之前的。
并且泛型的替换及作用是发生在创建对象的时间段的。。。。
所以时间段是相互冲突的,所以编译器不知道该怎么办,,所以报错了。。。。。
当创建Tiger对象的时候,我们把设置对应的泛型把T R M进行对应的替换
自定义泛型的细节
在接口中的成员默认是静态的,所以不可以使用泛型
1.
当继承接口的时候,就指定了泛型接口的类型
2.
3.当实现接口之后,接口没有指定泛型类型,那么默认为Object类型,当实现接口的抽象方法之后,默认把U和R替换为Object
规范写法:
1.
泛型方法,可以定义在普通类中,也可以定义在泛型类中
2.
对于泛型方法,我们在调用的时候 就确定它的类型了
3.
要明白泛型方法与方法使用泛型的区别
4.
泛型方法,可以使用类声明的泛型,也可以使用自己声明的泛型
把泛型理解为可以接收数据类型的一种数据类型就可以了。。。。
泛型练习
泛型与通配符结合 ![](https://i-blog.csdnimg.cn/blog_migrate/a708fa388ea1c4fdcec8a49802727eb1.png)
1.错误
2.
4.
JUnit单元测试框架
传统方式效率太低,并且要来回进行切换,在静态方法中调用非静态方法的时候还需要进行创建对象,这样显得十分难受
单元测试框架JUnit如何使用?
1.在方法头写上@Test
2.接着用Alt+Enter之后,我们选取的JUnit5.4版本
3.
3.在测试区出现绿色小箭头,点Run表示运行
练习
【554-567】