泛型
把元素的类型设计成一个参数,这个类型参数叫做泛型
集合中使用泛型
泛型的使用
1.jdk 5.0新增的特性
2.在集合中使用泛型:
总结:
① 集合接口或集合类在jdk5.0时都修改为带泛型的结构。
② 在实例化集合类时,可以指明具体的泛型类型
③ 指明完以后,在集合类或接口中凡是定义类或接口时,内部结构(比如:方法、构造器、属性等)使用到类的泛型的位置,都指定为实例化的泛型类型。
比如:add(E e) --->实例化以后:add(Integer e)
④ 注意点:泛型的类型必须是类,不能是基本数据类型。需要用到基本数据类型的位置,拿包装类替换
⑤ 如果实例化时,没有指明泛型的类型。默认类型为java.lang.Object类型。
3.如何自定义泛型结构:泛型类、泛型接口;泛型方法。见 GenericTest1.java
//在List中使用泛型
ArrayList<Integer> list = new ArrayList<>();
list.add(123);
list.add(456);
//在Map中使用泛型
HashMap<String,Integer> map = new HashMap();
map.put("Tom",123);
map.put("om",23);
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
Iterator<Map.Entry<String, Integer>> iterator = entrySet.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
自定义泛型结构
泛型类、泛型接口
如何自定义泛型结构:泛型类、泛型接口;泛型方法
①自定义带泛型类,实例化时要指明类的泛型 ②子类在继承带泛型的父类时,指明了泛型类型。则实例化子类对象时,不再需要指明泛型。
public class SubOrder extends Order<Integer>{//SubOrder不是泛型类 }
SubOrder sub1 = new SubOrder();
sub1.setOrder(Integer OrderT);
③子类在继承带泛型的父类时,没有指明泛型类型。则实例化子类对象时,可以指明泛型
public class SubOrder1<T> extends Order<T>{//SubOrder1:仍是泛型类 }
SubOrder1<String> sub2 = new SubOrder1<>();//实例化时指明类的泛型
sub2.setOrderT(String OrderT);
泛型方法
泛型方法: ①在方法中出现的泛型的结构,泛型参数与类的泛型参数没有任何关系。 ②换句话说,泛型方法所属的类是不是泛型类都没有关系。 ③泛型方法,可以声明为静态的。原因:泛型参数是在调用方法时确定,并非在实例化类时确定。
public <E> List<E> copyArrayToList(E[] arr){
ArrayList<E> list = new ArrayList<>();
for (E e : arr){
list.add(e);
}
return list; } }
泛型在继承方面的体现
Object obj = null;
String str = null;
obj = str;
Object[] arr1 = null;
String[] arr2 = null;
arr1 = arr2;
List<Object> list1 = null;
List<String> list2 = null;
list1 = list2 // 编译不通过
//此时list1和list2的类型不具有子父类关系,二者是并列关系!
通配符 ?
类A是类B的父类,G和G是没有关系的,二者共同的父类是:G<?>
List<Object> list1 = null;
List<String> list2 = null;
List<?> list = null;
list = list1;
list = list2;
操作
//添加(写入):对于List<?>就不能向其内部添加数据。
//除了添加null之外。
list.add(null);
//获取(读取):允许读取数据,读取的数据类型为Object。
Object o = list.get(0);
有限制的通配符
? extends Person :小于等于Person ? super Person :大于等于Person
? extends A:
G<? extends A> 可以作为G和G的父类,其中B是A的子类? super A:
G<? super A> 可以作为G和G的父类,其中B是A的父类
List<? extends Person> list1 = null; List<? super Person> list2 = null; List<Student> list3 = null; List<Person> list4 = null; List<Object> list5 = null; list1 = list3; list1 = list4;// list1 = list5; // list2 = list3; list2 = list4; list2 = list5;