泛型
来源:互联网 发布:印度废钞令 知乎 编辑:程序博客网 时间:2024/06/03 22:56
8. 泛型
8.1简介:
泛型:JDK1.5版本以后出现新特性,用于解决安全问题,是一个类型安全机制。
好处:
1.将运行时期出现问题ClassCastException,转移到了编译时期。,
方便于程序员解决问题。让运行时问题减少,安全。,
2,避免了强制转换麻烦。
泛型格式:通过<>来定义要操作的引用数据类型。
在使用java提供的对象时,什么时候写泛型呢?
通常在集合框架中很常见,只要见到<>就要定义泛型。
其实<> 就是用来接收类型的。
当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。
8.2泛型类
泛型类定义的基本语法格式:
Class 泛型类名<类型变量1,类型变量2,····,类型变量n>
{
//创建已存在集合类的泛型类对象
Public 已存在集合类型名<类型变量1,类型变量2,····,类型变量n> 对象名=new 已存在的集合构造<类型变量1,类型变量2,····,类型变量n > ();
//通过方法过载,来覆盖原集合类中的方法
Public void 原集合类中方法名 (类型变量1,类型变量2,····,类型变量n)
{
对象名.原集合类中方法名 (类型变量1,类型变量2,····,类型变量n);
}
····;
}
使用泛型定义一个新的List序列集合类型,使之只能用于存储Double类型的数据。通过方法的过载,重写了需要使用的LinkedList类中的几种方法:
import java.util.*;
class NewList<Double>
{
//创建新的List集合类型对象list,使其存储内容都Double类型数据
public List<Double> list = new LinkedList<Double>();
//方法过载:向LinkedList中添加数据
public void add(Double d)
{
list.add(d);
}
//方法过载:获取LinkedList中index指定位置的数据
public Double get(int index)
{
return list.get(index);
}
//方法过载:获取Iterator对象
public Iterator<Double> iterator()
{
return list.iterator();
}
//方法过载:移除LinkedList中index指定位置的数据
public Double remove(int index)
{
return list.remove(index);
}
//方法过载:设置LinkedList中index指定位置的数据
public Double set(int index,Double d)
{
return list.set(index,d);
}
}
8.3泛型方法:
是否拥有泛型方法,与其所在的类是否泛型没有关系。要定义泛型方法,只需将泛型参数列表置于返回值前。如:
public <T> void f(T x) {}
使用泛型方法时,不必指明参数类型,编译器会自己找出具体的类型。泛型方法除了定义不同,调用就像普通方法一样。
最后,需要注意的是,一个static方法,无法访问泛型类的类型参数,因为类还没有实例化,所以,若static方法需要使用泛型能力,必须使其成为泛型方法。
8.4泛型接口:
在定义泛型接口类的时候,在接口类名后使用一对尖括号“<>”来声明一组类型变量,以逗号间隔变量列表。
interface Demo<T> {// 定义泛型接口
publicvoid print(T param);// 定义抽象方法,此方法输出参数
}
// 实现泛型接口,方法一:
class Imple1<T>implements Demo<T> {
publicvoid print(T param) {
System.out.println("param = " + param);
}
}
//实现泛型接口,方法二:
class Imple2implements Demo<Imple2> {
publicvoid print(Imple2 param) {
System.out.println("param = " + param);
}
}
publicclassGenericsDemo {
publicstaticvoid main(String[] args) {
// 对以上程序进行测试
Imple1<String> demo = new Imple1<String>();
demo.print("Hello, Wrold!");
Imple2 im = new Imple2();
im.print(new Imple2());
}
}