泛型应用之一

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值