1、概述
泛型是JDK1.5版本添加的新特性,是一种安全机制,用于解决安全问题。
泛型主要使用在
集合框架中,为了保证存取数据的类型一致,就要指定要存取的数据类型,这里所说的数据类型是引用数据类型。
2、泛型的使用方式:
(1)泛型可以定义在方法上,那么就可以操作不同类型的数据。
例如:public <T> void show(T t){}
在方法上定义泛型,定义的是什么类型<T>,传入的数据就应该是什么类型的(T t)。
泛型也可以在静态方法中定义:且泛型的位置在
返回值类型前,修饰符后
(2)泛型可以定义在接口上。
例如:interface Inter <T>{ void show(T t) }
这里的参数时形参(形式参数),在某类在实现接口的时候指定的泛型就是实参(实际参数),
如<String>,这里指定的数据类型就是字符串类型,那么接收的数据类型也要是字符串类型
3、泛型限定
当泛型不明确时,用占位符(通配符)<?>
当泛型明确时,就指定具体类型 <T>
4、使用泛型的好处
(1)将运行时期的类型转换异常(ClassCastException)转移到编译时期, 便于程序员检查
(2)避免了强制类型转换的麻烦
下面举个简单的例子:
例如,向TreeSet集合中存储自定义对象(Student/Worker)。TreeSet集合可对集合中的元素进行排序
分析:在对学生和工人排序时,要定义两个比较器,强制使学生和工人具有比较性,而此时就使得代码的复用性减弱。
那么,就把学生和工人的共同属性向上抽取,形成Person类,在定义比较器时添加泛型,就使得存取的类型一致。
import java.util.*;
class GenericDemo3
{
public static void main(String[] args)
{
//接收的类型
TreeSet<Student> ts = new TreeSet<Student>(new Comp());
ts.add(new Student("wangshan---001"));
ts.add(new Student("wangshan---02"));
ts.add(new Student("wangshan---007"));
ts.add(new Student("wangshan---03"));
//获取的类型要与接收的类型一致
Iterator<Student> it = ts.iterator();
while (it.hasNext())
{
System.out.println(it.next().getName());
}
TreeSet<Worker> ts1 = new TreeSet<Worker>(new Comp());
ts1.add(new Worker("lisi01"));
ts1.add(new Worker("lisi09"));
ts1.add(new Worker("lisi06"));
ts1.add(new Worker("lisi009"));
Iterator<Worker> it1 = ts1.iterator();
while (it1.hasNext())
{
System.out.println(it1.next().getName());
}
}
}
//定义比较器
class Comp implements Comparator<Person>
{
//覆盖compare方法
public int compare(Person p1,Person p2)
{
//return p1.getName().compareTo(p2.getName());
return p2.getName().compareTo(p1.getName());
}
}
class Person
{
private String name;
Person(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public String toString()
{
return "person:" + name;
}
}
class Student extends Person
{
Student(String name)
{
super(name);
}
}
class Worker extends Person
{
Worker(String name)
{
super(name);
}
}