JDK5中的泛形允许程序员在编写集合代码时,就限制集合的处理类型,从而把原来程序运行时可能发生问题,转变为编译时的问题,以此提高程序的可读性和稳定性(尤其在大型程序中更为突出)。
注意:泛型是提供给javac编译器使用的,它用于限定集合的输入类型,让编译器在源代码级别上,即挡住向集合中插入非法数据。但编译器编译完带有泛形的java程序后,生成的class文件中将不再带有泛形信息,以此使程序运行效率不受到影响,这个过程称之为“擦除”。
泛形的基本术语,以ArrayList<E>为例:
ArrayList<E>中的E称为类型参数变量
ArrayList<Integer>中的Integer称为实际类型参数
整个ArrayList<Integer>称为参数化的类型ParameterizedType
泛型的典型应用
2,使用增强for循环迭代泛形集合中的元素。
3,存取HashMap中的元素。
使用泛形时的几个常见问题:
使用泛形时,泛形类型须为引用类型,不能是基本数据类型
ArrayList<String> list = new ArrayList<Object>();(错误写法)
解释:如果往ArrayList中存的是Interge,而左边却用String来对待,很明显这是不可以的。
ArrayList<Object> list = new ArrayList<String>(); (错误写法)
这个和上面的原因差不多。
ArrayList<String> list = new ArrayList ();(正确写法)
这句话肯定要行的,如果一个项目是jdk1.5版本之前的,而维护时确是现在,有了泛型。比如:
ArrayList list = new ArrayList<String>();(也是正确写法)
Java程序中的普通方法、构造方法和静态方法中都可以使用泛型。方法使用泛形前,必须对泛形进行声明,语法:<T> ,T可以是任意字母,但通常必须要大写。<T>通常需放在方法的返回值声明之前。
比如写个工厂类来产生DAO里面的实现类
泛型也可以用在类上 比如:
注意:泛型是提供给javac编译器使用的,它用于限定集合的输入类型,让编译器在源代码级别上,即挡住向集合中插入非法数据。但编译器编译完带有泛形的java程序后,生成的class文件中将不再带有泛形信息,以此使程序运行效率不受到影响,这个过程称之为“擦除”。
泛形的基本术语,以ArrayList<E>为例:
ArrayList<E>中的E称为类型参数变量
ArrayList<Integer>中的Integer称为实际类型参数
整个称为ArrayList<E>泛型类型
整个ArrayList<Integer>称为参数化的类型ParameterizedType
泛型的典型应用
1,使用迭代器迭代泛形集合中的元素。
/*创建一个带泛型的
Map<Student, String>*/
Map<Student, String> hashmap = new HashMap<Student, String>();
hashmap.put(new Student("zhangshan1",45), "shanghai");
Set<Student> keyset = hashmap.keySet();Iterator<Student> it = keyset.iterator();
while(it.hasNext()){Student stu = it.next();String addr = hashmap.get(stu);
System.out.println(stu.getName()+"的年龄是:"+stu.getAge()+" 所在地是:"+addr);
}
2,使用增强for循环迭代泛形集合中的元素。
Set<Map.Entry<Student, String>> mapentry = hashmap.entrySet();
for(Map.Entry<Student, String> en: mapentry){
Student student = en.getKey();
String address = hashmap.get(student);
System.out.println(student.getName()+"的年龄是:"+student.getAge()+" 所在地是:"+address);
}
3,存取HashMap中的元素。
使用泛形时的几个常见问题:
使用泛形时,泛形类型须为引用类型,不能是基本数据类型
ArrayList<String> list = new ArrayList<Object>();(错误写法)
解释:如果往ArrayList中存的是Interge,而左边却用String来对待,很明显这是不可以的。
ArrayList<Object> list = new ArrayList<String>(); (错误写法)
这个和上面的原因差不多。
ArrayList<String> list = new ArrayList ();(正确写法)
这句话肯定要行的,如果一个项目是jdk1.5版本之前的,而维护时确是现在,有了泛型。比如:
public List t1(){//以前写的项目
return new ArrayList();
}
//现在用
List<Integer> l = t1();
ArrayList list = new ArrayList<String>();(也是正确写法)
Java程序中的普通方法、构造方法和静态方法中都可以使用泛型。方法使用泛形前,必须对泛形进行声明,语法:<T> ,T可以是任意字母,但通常必须要大写。<T>通常需放在方法的返回值声明之前。
比如写个工厂类来产生DAO里面的实现类
public class DaoFactory {
private static final DaoFactory factory = new DaoFactory();
private DaoFactory(){
}
public static DaoFactory getInstance(){
return factory;
}
@SuppressWarnings("unchecked")
public <T> T CreateDao(String classname,Class<T> clazz){//利用泛型写一个声明返回类型为T的方法
try {
T t = (T) Class.forName(classname).newInstance();
return t;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
泛型也可以用在类上 比如:
class Demo<T> {
//在类上定义的泛形只对类的非静态成员有效
public void run(T t){
}
public void eat(T t){
}
public static <T> void test(T t){
}
}