一. 泛型
1. 集合中使用泛型
(1)集合接口或集合类都是带有泛型的结构;
(2)在实例化集合类时,可以指明具体的泛型类型;
(3)泛型的类型必须是类,不能是基本数据类型,如果要用到基本数据类型,使用包装类替换;
(4)实例化时如果没有指明泛型的类型,则默认为java.lang.Object类型
import java.util.*;
public class Test{
public static void main(String[] args) {
//在集合中使用泛型
ArrayList list = new ArrayList(); //增加泛型,使得集合中的数据都是整型
list.add(13);
list.add(12);
list.add(25);
list.add(10);
//list.add("A"); 编译时就会检查参数类型,如果不是整型,则会报错
for(Integer integer:list){
int i = integer;
System.out.println(i);
}
}
}
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Test{
public static void main(String[] args) {
//在HashMap中使用泛型
HashMap map = new HashMap();
map.put("Tom",22);
map.put("Bob",23);
map.put("Joe",25);
//map.put(12,"A"); 会报错
Set> set = map.entrySet();
Iterator> iterator = set.iterator();
while(iterator.hasNext()){
Map.Entry entry = iterator.next();
String key = entry.getKey();
int value = entry.getValue();
System.out.println(key + "=" + value);
}
}
}
2.自定义泛型类或接口
public class Test{
public static void main(String[] args) {
//如果定义了泛型类,实例化时没有指定类的泛型,则认为该泛型是Object类型
Person person1 = new Person();
person1.setSex(12);
person1.setSex("男");
//如果定义的类是带泛型的,建议在实例化时要指明类的泛型
Person person = new Person("Tom",23,"man");
person.setSex("男生"); //只能使用泛型指定的数据类型
//由于子类在继承带泛型的父类时,指明了泛型的类型,则实例化子类对象时,不需要再指明泛型类型
Man man = new Man();
man.setSex('男'); //由于子类指明了泛型的类型为Character,因此只能使用char型
//子类在继承带泛型的父类时,没有指明泛型的类型,则实例化子类对象时,需要指明泛型类型
Woman woman = new Woman();
woman.setSex("女生"); //使用上面指定的泛型类型
}
}
class Person{ //自定义泛型类
String name;
int age;
T sex; //在不确定变量的类型时,可以使用泛型;在实例化时需要给变量指定数据类型
public Person(){
}
public Person(String name,int age,T sex){
this.name = name;
this.age= age;
this.sex = sex;
}
public T getSex(){
return sex;
}
public void setSex(T sex){
this.sex = sex;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + ''' +
", age=" + age +
", sex=" + sex +
'}';
}
}
class Man extends Person{ //Man不是泛型类
}
class Woman extends Person{ //Woman是泛型类
}
3.自定义泛型方法
import java.util.ArrayList;
import java.util.List;
public class Test{
public static void main(String[] args) {
Person person = new Person<>();
Integer[] array = new Integer[]{12,13,10,25};
List list = person.gradeList(array);
System.out.println(list); //[12, 13, 10, 25]
}
}
class Person{
String name;
int age;
T sex;
public Person(){
}
public Person(String name,int age,T sex){
this.name = name;
this.age= age;
this.sex = sex;
}
//自定义泛型方法
public List gradeList(E[] array){ //泛型方法中的泛型参数与类的泛型参数无关,泛型方法与该类是不是泛型类无关
ArrayList list = new ArrayList<>();
for(E e:array){
list.add(e);
}
return list;
}
}
4.通配符:?
(1)类A是类B的父类,但是G和G不具备子父类关系,是并列的;
(2)类A是类B的父类,则A
import java.util.ArrayList;
import java.util.List;
public class Test{
public static void main(String[] args) {
Object obj = "A";
String str = "AA";
obj = str;
Object[] arr1 = new Object[3];
String[] arr2 = new String[3];
arr1 = arr2;
List
(3)类A是类B的父类,但是G和G不具备子父类关系,他们共同的父类是G>
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Test{
public static void main(String[] args) {
List
import java.util.ArrayList;
import java.util.List;
public class Test{
public static void main(String[] args) {
List list1 = new ArrayList<>();
list1.add("A");
list1.add("B");
list1.add("C");
List> list = new ArrayList<>();
list =list1;
//list.add("D"); 不能向List>中添加数据
Object obj = list.get(0); //可以读List>中的数据
System.out.println(obj); //A
}
}
(4)有限制条件的通配符
?extends A:G extends A>可以作为G和G的父类,其中B是A的子类
?super A:G super A>可以作为G和G的父类,其中B是A的父类
import java.util.ArrayList;
import java.util.List;
public class Test{
public static void main(String[] args) {
List extends Person> list1 = new ArrayList<>(); // ?小于等于Person
List super Person> list2 = new ArrayList<>(); // ?大于等于Person
List list3 = new ArrayList<>();
List list4 = new ArrayList<>();
List 


