泛型集合:
集合中可以存储任意类型的对象元素,但是当把一个对象存入集合后,集合会“忘记”这个对象的类型,将该对象从集合中取出时,这个对象的编译类型就统一变成了Object类型。换句话说,在程序中无法确定一个集合中的元素到底是什么类型,那么在取出元素时,如果进行强制类型转换就很容易出错。
所以就可以限制在集合中存储的对象
把数据类型当作参数进行传递
格式:
ArrayList<参数化类型> list = new ArrayList<参数化类型>();
传递的数据类型必须是引用数据类型。基本数据类型报错,不过可以使用基本数据类型的包装类。
泛型接口:
比如说商品类和学生类都需要增删改查,需要一个Server来进行业务类,所以就可以用泛型来简化,不用再单独创建一个userService接口和goodsService接口,只需要用Server接口的泛型就可以让学生类和商品类来继承了。
如果是goods类特有的方法可以再创建一个接口放
例如:泛型接口
public interface Service<E> {
//公有的接口
public Boolean add(E e);
public Boolean del(E e);
public E find();
}
实现泛型接口的goods服务类
implements Service<Goods>传入Goods类型
public class GoodsService implements Service<Goods>,GoodsInfo{
@Override
public Boolean add(Goods goods) {
return null;
}
....省略......
}
实现泛型接口的user服务类
implements Service<User>传入User类型
public class Userservice implements Service<User>{
@Override
public Boolean add(User user) {
return null;
}
......省略......
}
泛型类:
这些字母可以随便写ABCDEFG
类中传入什么类型的变量,方法中就接收什么样的变量
类的对象和方法的一样
public class Userserver <K,V>{
public K key;
public V value;
public boolean put(K k,V v){
this.key = k;
this.value = v;
return true;
}
}
泛型方法:
如果在类上搞泛型那么下面的方法如果用泛型就得和类用一样的
我们就想只有方法用和类不一样的
泛型方法只需在修饰符和类型之间加一个<>
里面写上该有的东西就行了
public <E> E get(E a){
return a;
}
1.<? extends Pet>
?必须是Pet类或其子类
这里泛型对传入的类型做了限制,只能传入Pet的子类或pet
不能对list01进行add,但是可以赋值给list
2.<? super Dog>
?必须是Dog类的父类或是当前类
限制get功能,get调用返回Object类型
Object o = list.get(0);