1.泛型的定义
将对象的类型作为参数,指定到其他类或者方法上,从而保证类型转换的安全性和稳定性,这就是泛型。
泛型的定义语法格式如下:
类1或者接口<类型实参>对象=new类2<类型实参>()
tips:首先,"类2"可以是"类1"本身,可以是"类1"的子类,还可以是接口的实现类;其次,"类2"的类型实参必须与"类1"中的类型实参相同。
底层原理
2.泛型在集合中的应用
在List接口中,其add()方法的参数是Object类型,不管把什么对象放入List接口及其子接口或实现类中,都会被强制转换为Object类型。在通过get()方法取出集合中元素时必须进行强制类型转换,不仅繁琐而且容易出现ClassCastException异常。Map接口中使用put()方法和get方法存取对象时,以及使用Iterator的next()方法获取元素时存在同样的问题。JDK1.5通过引入泛型有效地解决了这个问题。JDK1.5中以及改写了集合框架中所有接口和类,增加了对泛型的支持,也就是泛型集合。使用泛型集合在创建集合对象时指定集合中元素的类型,从集合中取出元素时无需进行强制类型转换,并且如果把非指定类型对象放入集合,会出现编译错误。
List和ArrayList的泛型形式时List
示例1:ArrayList的泛型形式对比
使用泛型前
package top.xiaoguyouqu.shangke;
import java.util.ArrayList;
import java.util.List;
public class fanxing {
public static void main(String[] args) {
//使用泛型前
NewTitle NBA = new NewTitle(1, "保罗乔治", "小明");
NewTitle CBA = new NewTitle(2, "郭艾伦1", "小利");
List newTitles = new ArrayList();
newTitles.add(NBA);
newTitles.add(CBA);
System.out.println("---------输出---------");
for (Object obj:newTitles){
NewTitle title = (NewTitle)obj;
System.out.println(title.getName());
}
System.out.println("---------输出---------");
}
}
使用泛型后
package top.xiaoguyouqu.shangke;
import java.util.ArrayList;
import java.util.List;
public class fanxing {
public static void main(String[] args) {
//使用泛型前
NewTitle NBA = new NewTitle(1, "保罗乔治", "小明");
NewTitle CBA = new NewTitle(2, "郭艾伦1", "小利");
List<NewTitle> newTitles = new ArrayList<NewTitle>();
newTitles.add(NBA);
newTitles.add(CBA);
System.out.println("---------输出---------");
for (NewTitle title:newTitles){
System.out.println(title.getName());
}
System.out.println("---------输出---------");
}
}
运行结果
tips:List和ArrayList关系
List 是一个接口,它定义了一个用于表示多个元素的序列,但不直接包含具体的实现代码。
ArrayList 是 List 接口的一个具体实现类,负责执行接口所规定的功能,如添加、删除、查找和修改元素等。
示例2:HashMap的泛型形式对比
使用泛型前
package top.xiaoguyouqu.shangke;
import java.util.HashMap;
import java.util.Map;
public class hashfanxing {
public static void main(String[] args) {
student s1 = new student("小明",19,88);
student s2 = new student("小李",20,98);
//使用泛型前
Map students = new HashMap();
students.put("jake",s1);
students.put("joker",s2);
System.out.println("--------输出----------");
for (Object value:students.values()){
student s = (student)value;
System.out.println("姓名:"+s.getName());
}
System.out.println("------------------------");
}
}
使用泛型后
package top.xiaoguyouqu.shangke;
import java.util.HashMap;
import java.util.Map;
public class hashfanxing {
public static void main(String[] args) {
student s1 = new student("小明",19,88);
student s2 = new student("小李",20,98);
//使用泛型前
Map<String,student> students = new HashMap<String,student>();
students.put("jake",s1);
students.put("joker",s2);
System.out.println("--------输出----------");
for (student value:students.values()){
System.out.println("姓名:"+value.getName());
}
System.out.println("------------------------");
}
}
运行结果