java高级编程day23
泛型
泛型的类和接口
泛型保证了类型转化安全
1.jdk5.0中新增的特有属性
2.集合中使用泛型:
总结:
① 集合接口或集合类在jdk5.0时都可以修改为带泛型的结构
② 在实例化集合类时,可以指明集体的泛型接口
③指明完之后,在集合类或接口中凡是定义类和接口时,内部结构(比如:方法、构造器、属性等)使用到类的位置,都指定为实例化的泛型类型
④ 注意点:泛型的类型必须是类,不能时基本数据类型。需要用到基本数据类型的位置,拿包装类替换
⑤如果实例化时,没有指定泛型的类型,默认类型就是java.lang.Object类型
如果继承的父类为泛型,但是子类没有设定泛型的指定类型那么也为Object类型
只有都为创建时这样:public A<T> extend B<T>这样子类也为泛型
如果在继承父类时,确定了父类的泛型,那么子类的泛型就是父类指定的泛型类型
泛型不同的引用不能相互赋值
静态方法中不能使用类的泛型
异常类是不能有泛型类的
想要创建T泛型类型的数组
不能直接创建,因为T是形参当我赋值后才会生效
正确创建方法:T[] arr = (T[]) new Object[10];
泛型可以部分保留
泛型的方法
在方法中出行了泛型结构,泛型参数与类的泛型参数没有任何关系
泛型方法所属的泛型类是不是泛型类都没有关系
泛型方法可以声明为静态方法,原因:泛型参数是在调用方法是确定的,并非类的实例化时确定的
泛型在继承方面的使用
类A是类B的父类,G<A>和G<B>不具备子父类关系,属性并列关系
补充:A<G>与B<G>就存在字符类关系,体现在var泛型类可以证明
通配符的使用
通配符:?
类A是类B的父类,G<A>和G<B>,二者没有关系(并列关系),二者共同的父类为G<?>
添加(写入):对于List<?>就不能向其内部添加数据
特例:可以添加null
获取(读取):允许读取数据,读取数据的类型为Object类型
有限制条件的通配符的使用
? extend Person
类要小于等于Person类,也就是说,是Person类本身或者Person类的子类
可以取值类型只能为Person类,或Person的父类,不能将Person的子类取值
不赋值,因为父类无法给子类赋值,无法确定类是多小的子类
? super Person
类要大于等于Person类,也就是说,是Person类本身或者Person类的父类
可以取值,因为不知道父类多大,所以类型只能为Object类
可以赋值将Person和子类都可以
练习
定义个泛型类DAO<T>,在其中定义一个Map成员变量,Map的键 String类型,值为T类型。
分别创建以下方法:
public void save(String id,T entity):
保存T类型的对象到Map成员变量中
public T get(String id):从map中获取id对应的对象
public void update(String id,T entity):替换map中key为id的内容改为entity对象
public Listlist():返回map中存放的所有T对象
public void delete(String id):删除指定id对象
定义一个User类:
该类包含:private成员变量(int类型)id,age;(String型)name。
定义一个测试类:
创建DAO类的对象,分别调用其save、get、update、Iist、delete方法来操作User对象
DAO类
public class DAO<T> {
private Map<String, T> map;
public DAO() {
this.map = new HashMap<>();
}
public void save(String id, T entity) {
map.put(id, entity);
}
public T get(String id) {
return map.get(id);