泛型应用之一

来源:互联网 发布:西门子840d软件 编辑:程序博客网 时间:2024/05/17 21:52
JDK5中的泛形允许程序员在编写集合代码时,就限制集合的处理类型,从而把原来程序运行时可能发生问题,转变为编译时的问题,以此提高程序的可读性和稳定性(尤其在大型程序中更为突出)。


注意:泛型是提供给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){}}


0 0
原创粉丝点击