一、 泛型
1、泛型的好处
**1)编译时,检查添加元素的类型,提高了安全2)减少了类西较换的次数,提高效率
不使用泛型
Dog -> Object -> Dog //放入到ArrayList 会先转成Object,在取出时,还需要转换成Dog
**使用泛型
Dog -> Dog -> Dog//放入时,和取出时,不需要类型转换,提高效率3)不再提示编译警告
2、泛型介绍
泛(广泛)型(类型)=> Integer,String,Dog(自定义类型)1)泛型又称参数化类型,是Jdk5.0出现的新特性,解决数据类型的安全性问题
2)在类声明或实例化时只要指定好需要的具体的类型即可。
3) Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生
ClassCastException异常。同时,代码更加简洁、健壮
4)泛型的作用是:可以在类声明时通过一个标识表示类中某个属性的类型,或者是某个方
法的返回值的类型,或者是参数类型。[有点难]
可以在New一个对象的时候
3、泛型的语法
4、泛型语法和使用:
5、自定义泛型
1):自定义接口基本语法
interface 接口名<T,R..>{
}
细节:
2)、自定义泛型方法
基本语法:
修饰符<T,R..>返回类型方法名(参数列表){ };
示例:
import java.util.ArrayList;
@SuppressWarnings({"all"}) public class CustomMethodGeneric { public static void main(String[] args) { Car car = new Car(); car.fly("宝马", 100);//当调用方法时,传入参数,编译器,就会确定类型 System.out.println("======="); car.fly(300, 100.1);//当调用方法时,传入参数,编译器,就会确定类型 //测试 //T->String, R-> ArrayList Fish<String, ArrayList> fish = new Fish<>(); fish.hello(new ArrayList(), 11.3f); } } //泛型方法,可以定义在普通类中, 也可以定义在泛型类中 class Car {//普通类 public void run() {//普通方法 } //说明 泛型方法 //1. <T,R> 就是泛型 //2. 是提供给 fly使用的 public <T, R> void fly(T t, R r) {//泛型方法 System.out.println(t.getClass());//String System.out.println(r.getClass());//Integer } } class Fish<T, R> {//泛型类 public void run() {//普通方法 } public<U,M> void eat(U u, M m) {//泛型方法 } //说明 //1. 下面hi方法不是泛型方法 //2. 是hi方法使用了类声明的 泛型 public void hi(T t) { } //泛型方法,可以使用类声明的泛型,也可以使用自己声明泛型 public<K> void hello(R r, K k) { System.out.println(r.getClass());//ArrayList System.out.println(k.getClass());//Float } }
6、泛型的继承和通配符:
1)、泛型不具备继承性
2)、<?>:支持任意泛型类型
3)、<? extends A>::支持A类以及A类的子类,规定了泛型的上限
4)、<? super A>::支持A类以及A类的父类,不限于直接父类,规定了泛型的下限
二、Junit
基本介绍:
1).JUnit是一个Java语言的单元测试框架
2).多数Java的开发环境都已经集成了JUnit作为单元测试的工具
简单用例:
import org.junit.jupiter.api.Test; import java.util.*; public class Generics { public static void main(String[] args) { } @Test public void testList(){ DAO<User> dao = new DAO<>(); dao.save("1",new User(1,1,"zzz")); dao.save("2",new User(2,10,"xxx")); dao.save("3",new User(3,20,"ccc")); System.out.println(dao.list()); System.out.println(dao.get("2")); dao.update("2", new User(4, 40, "vvv")); dao.delect("3"); System.out.println(dao.list()); } } class DAO<T>{ private Map<String,T> map = new HashMap<>(); public void save(String id,T entity){ map.put(id, entity); } public T get(String id){ T t = map.get(id); return t; } public void update(String id,T entity){ map.put(id, entity); } public List<T> list(){ ArrayList<T> list = new ArrayList<>(); Set<String> strings = map.keySet(); Iterator<String> iterator = strings.iterator(); while (iterator.hasNext()) { String next = iterator.next(); list.add(map.get(next)); } return list; } public void delect(String id){ map.remove(id); } } class User{ private int id; private int age; private String name; @Override public String toString() { return "User{" + "id=" + id + ", age=" + age + ", name=‘" + name + ‘\‘‘ + ‘}‘; } public int getId() { return id; } public void setId(int id) { this.id = id; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public User(int id, int age, String name) { this.id = id; this.age = age; this.name = name; } }