java泛型

原文链接: java泛型

上一篇: 常见函数

下一篇: PAT A1047. Student List for Course (25)

package ahao.test1;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;

import sun.org.mozilla.javascript.internal.ObjArray;

/*
 * 泛型测试
 * 	泛型是给javac编译器使用的,限定集合输入类型
 * 编译完后会去掉类型信息,提升运行效率
 */
public class GenericTest {

	public static void main(String[] args) throws Exception {
		// test1();
		ArrayList<String> a = new ArrayList<String>();
		a.add("asd");
		a.add("hello");
		print(a);

		ArrayList b = new ArrayList();
		b.add(1);
		b.add("asd");
		b.add(12.1);
		print(b);

		test3();

		// 泛型方法推断,取交集
		Integer i = add(2, 3);
		Number n = add(2, 2.2);
		Object obj = add("a", 1);

		String[] strs = { "a", "b", "c", "d" };
		System.out.println(Arrays.asList(strs));
		swap(strs, 1, 2);
		System.out.println(Arrays.asList(strs));

		Object t = "aa";
		String s = autoConvert(t);
		System.out.println(s);

		test5();
	}

	// 通过反射得到泛型
	public static void test5() throws Exception {
		// 反射获得泛型类型
		ArrayList<String> arr = new ArrayList<String>();
		Method m = GenericTest.class.getMethod("apply", List.class);
		Type[] type = m.getGenericParameterTypes();
		ParameterizedType ptype = (ParameterizedType) type[0];
		System.out.println("原始类型" + ptype.getRawType());
		System.out.println("泛型实际类型"
				+ ptype.getActualTypeArguments()[0]);
	}

	// 辅助方法
	public static void apply(List<Date> list) {

	}

	public static void test1() throws NoSuchMethodException,
			IllegalAccessException, InvocationTargetException {
		ArrayList cols = new ArrayList();
		cols.add(1);
		cols.add("123");
		cols.add(1.2);
		System.out.println(cols.get(2).getClass());
		System.out.println(cols);

		// 保证类型一致
		ArrayList<String> arr = new ArrayList<String>();
		arr.add("ad");
		arr.add("cc");
		System.out.println(arr);

		// 编译后类型信息被消除
		ArrayList<String> arr1 = new ArrayList<String>();
		ArrayList<Integer> arr2 = new ArrayList<Integer>();
		System.out.println(arr1.getClass() == arr2.getClass());

		// 通过反射绕过类型检查
		Class cla = arr1.getClass();
		Method m = cla.getMethod("add", Object.class);
		m.invoke(arr1, 12);
		System.out.println(arr1);

		// 参数化类型不考虑继承关系
		// ArrayList<Object> a = new ArrayList<String>();

		// 数组不能使用参数化类型
		ArrayList bb[] = new ArrayList[10];
		// ArrayList<String> aa[] = new ArrayList<String>[10];
	}

	// 使用通配符打印任意参数化集合 ?表示任意类型
	public static void print(Collection<?> col) {
		// 只能调用与类型无关的方法
		col.size();
		// col.add(new Object());

		for (Object obj : col) {
			System.out.println(obj.getClass().getName() + "-" + obj.toString());
		}

		// ?通配符可引用各种其他参数化类型
		col = new ArrayList<String>();

		// 限定上界,必须是指定类的子类
		ArrayList<? extends Number> t1 = new ArrayList<Integer>();
		// ArrayList<? extends Number> t2 = new ArrayList<String>();

		// 通配符总是包括自己
		// 限定下界,必须是指定类型的父类
		ArrayList<? super Integer> t3 = new ArrayList<Number>();
		// ArrayList<? super Number> t4 = new ArrayList<String>();

	}

	// map
	public static void test3() {
		Map<String, Integer> map = new TreeMap<String, Integer>();
		map.put("ahao", 12);
		map.put("ace", 17);
		Set<Map.Entry<String, Integer>> set = map.entrySet();
		for (Entry<String, Integer> data : set) {
			System.out.println(data.getKey() + "-" + data.getValue());
		}
	}

	public static <T> T add(T x, T y) {
		return null;
	}

	// 交换任意数组元素(非基本类型)
	public static <T> void swap(T[] arr, int x, int y) {
		T t = arr[x];
		arr[x] = arr[y];
		arr[y] = t;
	}

	// 使用泛型自动转换
	public static <T> T autoConvert(Object obj) {
		return (T) obj;
	}

}

// 泛型crud
class GenericMgr<T> {
	public void add(T t) {

	}

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

	public void del(T t) {

	}

	public Set<T> findByConditions() {
		return null;
	}

	public static <E> E findByName() {
		return null;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值