泛型
一、泛型的概念
JDK1.5设计了泛型的概念。泛型即为“类型参数”,这个类型参数在声明它的类、接口或方法中,代表未知的通用的类型。
如果有了泛型并使用泛型,既能保证安全,又能简化代码。
使用泛型类创建对象时, 如果没有明确泛型类型, 默认类型为 Object
二、为什么要使用泛型?
这里拿
集合
举例,比如说我们有一个集合保存学生的信息,现在要打印学生的成绩。
Collection students = new ArrayList();
Student swk = new Student("孙悟空", 80);
Student zbj = new Student("猪八戒", 60);
students.add(swk);
students.add(zbj);
students.add("唐僧");
// 输出学生的成绩
for (Object student : students) {
Student stu = (Student)student;
System.out.println(stu.getScore());
}
编译通过了,但是运行时报错 ClassCastException
.。主要原因就是集合保存的是 Object 类型。
而我们需求是只保存学生, 保存其他的类型明显不利于我们对数据的处理,这个时候就可以使用泛型。
使用泛型处理问题
这时候发现,保存其他类型在编译期间直接就报错了, 这就是泛型的好处。 相当于给这个集合贴了一个标签, 只能保存标签里的数据。并且循环的时候因为泛型指定的Student ,直接使用就可以了。
三、泛型类
泛型类型用于类的定义中,被称为泛型类。通过泛型可以完成对一组类的操作对外开放相同的接口。最典型的就是各种容器类,如:List、Set、Map。
四、泛型接口
泛型接口与泛型类的定义及使用基本相同。泛型接口常被用在各种类的生产器中
实现类实现泛型接口时, 如果没有明确泛型类类型, 这个实现类仍然是泛型类
五、泛型方法
public class MyClass{
// 泛型方法
public <T> void test(T t){
}
}
六、通配符
- <?> 通配符, 表示任意泛型类型
List<?> list = null; list = new ArrayList<Object>(); list = new ArrayList<Animal>(); list = new ArrayList<Cat>;
- <? extends T> 设定通配符上限
List<? extends Animal> list = null; list = new ArrayList<Object>(); // 编译失败 list = new ArrayList<Animal>(); list = new ArrayList<Cat>;
- <? super T> 设定通配符下限
List<? super Animal> list = null; list = new ArrayList<Object>(); list = new ArrayList<Animal>(); list = new ArrayList<Cat>; // 编译失败