563 为什么使用泛型
是一个新特性
容器 标签
为了更严格
arrayList.add(Object) 什么都能放,没有限制,危险。
把元素的类型设计成一个参数,这个类型参数叫泛型,
boolean add(E e);
这个类型参数将在使用时确定。
数组不使用泛型下的弊端
问题1:类型不安全
list.add("tom");
问题2 强转时出现classCastException
在添加时做一些检查
for(Object score:list){
int stuScore=(Integer) score;
}
564 泛型与在file中使用泛型
集合中使用泛型
泛型是类型,使用时不能使用基本数据类型。在需要使用基本数据类型时候,使用包装类替换。
优点:编译时,进行类型检查,保证数据安全,避免了强转操作。
ArrayList<Integer> list=new ArrayList<Integer>();
list.add(78);
方式二:迭代器实现
Iterator<Integer> iterator=list.iterator();
while(iterator.hasNext()){
int stuScore=iterator.next();
sout(stuScore);
}
HashMap使用泛型
Map<String,Integer> map=new HashMap<String,Integer>();
//泛型嵌套
Set<Entry<String,Integer>> entry=map.entrySet();
565 泛型练习
指明后,方法的形参就发生改变
public class Employee impletements Comparable<Employee>{
public int compareTo(Employee o){
return 0;
}
}
比较器只要声明中加上泛型,后面都可以用泛型。
566 自定义泛型类举例
如果定义了泛型类,实例化没有指明类的泛型,则认为此泛型类型为Object类型。
Order order=new Order();
order.setOrderT(123);
order.setOrderT("abd");
子类继承了带泛型的父类,
public class SubOrder1<T> extends Order<T> {
//subOrder1仍然是泛型类
}
public class SubOrder extends Order<T> {
//subOrder不再是是泛型类
}
567 自定义泛型类接口注意点
1 泛型类可能有多个参数,应将多个参宿一起放在尖括号。
4 泛型不同的引用不能相互赋值。
5 泛型不指定,将被擦除,对应的类型按object处理,但不等同;要使用,一路都使用。
8 静态方法中不能使用泛型,
reason
类的泛型是造对象时候指定,实例化时候,而静态结构要早于对象的创建。
9 异常类不能是泛型。
子类保留父类泛型
568 自定义泛型接口举例
什么是泛型方法
在方法中出现泛型结构,泛型参数与类的泛型参数没有任何关系,
泛型方法所属的类是不是泛型类都没有关系
泛型方法在调用时,指明泛型参数的类型,并非在实例化类时确定。
569 泛型类 泛型方法使用情景
泛型类使用
只能操作student
pulbic class DAO<T>{//操作表的共性操作dao
public void add(T t){
}
}
子类
public class StudentDAO extends DAO<Student>{//只能操作某个表的dao
}
泛型方法
//获取表中记录数,获取员工入职时间
public <E> E getValue(){
return null;
}
570 泛型在继承方面的体现
//将子类对象赋值父类的引用
List<Object> list1=null;
List<String> list2=null;
list1=list2;//不成立,不具备子父类关系,二者并列关系
571 通配符使用
没有多态,需要写很多重载方法。
为了解决上面的问题,需要找两个并列的父类,
通配符:?
public void test(){
List<Object> list1=null;
List<String> list2=null;
List<?> list=null;
list=list1;
list=list2;
}
小结
类A时类B的父类,G,G没有关系,二者的共同父类时G<?>
572 使用通配符后数据读取和写入要求
除了添加null外,对于List<?>不能向内部加数据,
获取允许,读取的数据类型为object
Object o=list.get(0);
573 有限条件通配符使用
public void test(){
List<? extends Person> list1=null;
List<? super Person> list2=null;
List<Student> list3=null;
list<Object> list5=null;
list1=list5;//不成立
//就是范围比较
}
理解成 super扩大范围,extends缩小范围,