Java泛型

一:泛型指省去类型转换之苦。泛型集合:只能存储同一类型的对象

Java的泛型只在编译前对集合类型进行规范,编译后将去“类型化”不再保留泛型的信息。

 

二:泛型规则

1.参数化类型不等,不考虑类型参数的继承关系

   Vector<String> v=new Vector<Object>();    //错误 

   Vector<Object> v=new Vector<String>();    //错误

2.在创建数组实例时,数组的元素不能使用参数化的类型

   Vector<Integer> vectorList[]=new Vector<Integer>[10];   //语法错误

3.参数类型化与原始类型的兼容性

   Collection<String> c=new Vector();

   Collection c=new Vector<String>();

 

三:泛型中的“?”通配符

    "?"代表任意类型,使用?通配符可以引用其他参数化的类型,?通配符定义的变量主要用作引用调用与参数化无关的方法,不能调用与参数化有关的方法(比如add()方法)

 

四:限定通配符的边界

       1.限定通配符的上边界:

Vector<? extends Number> x=new Vector<Integer>();         //Integer必须是Number的子类

Vector<? extends Number> x=new Vector<Integer>();        //错误

       2.限定通配符的下边界:

Vector<? super Integer> x=new Vector<Number>();         

Vector<? super Integer> x=new Vector<Number>();           //错误

 

五:代码测试

1.// 对map的泛型进行迭代

HashMap<String, Integer> maps = new HashMap<String, Integer>();
  maps.put("wzl", 20);
  maps.put("hlw", 21);
  // 将map型转换成Set
  Set<Map.Entry<String, Integer>> entrySet = maps.entrySet();
  for (Map.Entry<String, Integer> entry : entrySet) {
   System.out.println(entry.getKey() + ":" + entry.getValue());
  }


2.// 泛型中的"?"通配符的使用(不能调用与参数化有关的方法(比如add()方法))

public static void printCollection(List<?> list) {
		System.out.println(list.size());
		for (Object object : list) {
			System.out.println(object);
		}
	}


 

3.使用类似于C++的模版解决'?"通配符不能调用参数化的方法

	public static <T> void printCollection2(List<T> list, T obj) {
		System.out.println(list.size());
		for (Object object : list) {
			System.out.println(object);
		}
		list.add(obj);
	}


 

 4. // 使用泛型对任意类型的数组元素进行交换

public static <T> void swap(T[] a, int j, int k) {
		T temp = a[j];
		a[j] = a[k];
		a[k] = temp;
	}


5.//自定义泛型类,目的:类中的多个方法使用的是同一类型

/*
 * 自定义泛型类
 */
//数据的crud
public class Geneticdao<T> {
	public void add() {
	}

	public T findById(int id) {
		return null;
	}

	// 查询条件
	public Set<T> findByConditions(String where) {
		return null;
	}

	public void Update(T obj) {
	}
}

6.//创建泛型类对象,指定泛型类对象类型

	Geneticdao<String> dao=new Geneticdao<String>();

PS:静态方法不能用泛型的类,因为静态方法无需创建对象就能调用,无法确定静态方法所属对象的类型!!!

 

7.//通过反射来获得泛型的实际参数类型

//通过将类型转换成一个方法的参数,通过反射获取该方法的参数类型

Method applyMethod = GenericTest.class.getMethod("apply", Vector.class);
		// 得到参数类型组
		java.lang.reflect.Type[] types = applyMethod.getGenericParameterTypes();
		ParameterizedType type = (ParameterizedType) types[0];
		System.out.println(type.getActualTypeArguments()[0]); // java.util.Date//得到泛型的实际类型参数
	}

	// 通过反射获取泛型的实际参数类型
	public static void apply(Vector<Date> v) {

	}



 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值