1. 为什么需要泛型
1.1 使用集合时可能会发生安全的问题:可以向集合中放入任何类型
1.2 麻烦:从集合中获取元素,需要进行类型的强制转换
2. 使用泛型:使用泛型方法,泛型类。
package test.com.atguigu.javase.lesson8;
import com.atguigu.javase.lesson8.Person;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
public class UseGenericTestTest {
@Test
public void testUseGeneric(){
Collection<Person> persons = new ArrayList<>();
persons.add(new Person());
persons.add(new Person());
persons.add(new Person());
persons.add(new Person());
//调用Collection的toArray方法把该集合转为Person类型的数组
Person[] personArray = persons.toArray(new Person[0]);
System.out.println(personArray.length);//4
Map<String, Person> personMap = new HashMap<>();
personMap.put("AA1",new Person("AA",12));
personMap.put("BB2",new Person("BB",12));
personMap.put("CC3",new Person("CC",12));
personMap.put("DD4",new Person("DD",12));
for (Map.Entry<String, Person> entry:personMap.entrySet()){
String key = entry.getKey();
Person val = entry.getValue();
System.out.println(key + "--" + val);
}
}
}
3. 定义泛型
3.1 定义泛型类
3.1.1 声明类(接口)时,在类名的后面,括号的前面使用<>来声明泛型,可以声明多个泛型。
在类中凡是可以使用类型的地方都可以使用类中声明的泛型。
3.2 泛型方法
3.2.1 在类(不一定是泛型类)中使用泛型方法
3.2.2 在方法的返回值前面使用<>声明泛型类型,则在方法的返回值,参数,方法体中都可以使用该泛型
4. 通配符
4.1 如果Foo是Bar的一个子类型(子类或子接口),而G是某种泛型类型声明,那么G是G的子类型并不成立: Person是Object的子类,但是List却不是List的子类!
printPersons(List persons); 该方法的参数只能是Person类型的List,而不能Person任何子类的List,例如Student类型。
4.2 List