import java.util.Collection;
public class GenericTest {
/**
* T
* 类型推断:
* 1.多个参数,不同的类型,又没有返回值,取最大交集
*2. 如果有返回值,则根据返回值
* Number x1 = add(2.3,2);
* Object x2 = add(3,"abc");
* 会取最小公倍数
*
* <T> 说明类型
* @param args
*/
public static void main(String[] args) {
Object obj = "abc";
String str = autoConvertType(obj);
}
//根据返回值类型确定T
public static <T> T autoConvertType(Object obj) {
return (T)obj;
}
private static <T> void fillArray(T[] dest, T obj) {
for(int i=0;i<dest.length;i++) {
dest[i] = obj;
}
}
private static <T> void swap(T[] a, int i, int j) {
T tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
private static <T> T add(T x, T y) {
return null;
}
//通配符比T高效,但是操作有限,比如不能使用add(),类型不确定,编译通不过
public static void printCollection(Collection<?> collection) {
System.out.println(collection.size());
for(Object obj:collection) {
System.out.println(obj);
}
}
public static <T> void printCollection2(Collection <T> collection, T arg) {
System.out.println(collection.size());
for(Object obj:collection) {
System.out.println(obj);
}
//可以通过
collection.add(arg);
}
public static <T> void copy1(Collection<T> dest, T[] src) {
}
public static <T> void copy2(T[] dest, T[] src) {
}
}
import java.util.Set;
/**
* 把T定义到类上,类级别的泛型,统一方法的泛型类型
* 有多个方法使用泛型,使用类级别的泛型
* @author ETHAN
*
*GenericDao<E>
*
*GenericDao<Person> dao = new GenericDao<Person>();
*
*编译过后,泛型就被编译器×除了,去掉了
*上边的没法得到泛型参数类型
*但可以通过方法中的参数(采用了泛型),获取泛型
* @param <T>
*/
public class GenericDao<T> {
public void add(T obj) {
}
public T findById(int id) {
return null;
}
public void delete(int id) {
}
public void delete(T obj) {
}
public void update(T obj) {
}
//静态方法,独立泛型
public static <T> void update2(T obj) {
}
public T findByUserName(String name) {
return null;
}
public Set<T> findByConditions(String where) {
return null;
}
}
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Date;
import java.util.Vector;
public class ReflectGenericTest {
/**
* 通过反射获得泛型的实际类型参数
*/
public static void main(String[] args) throws Exception {
Method applyMethod = ReflectGenericTest.class.getMethod("applyVector", Vector.class);
Type[] types = applyMethod.getGenericParameterTypes();
//参数化类型
ParameterizedType pType = (ParameterizedType) types[0];
System.out.println(pType.getRawType());
//HashMap<K,V>多个
System.out.println(pType.getActualTypeArguments()[0]);
/*
* 打印结果:
* class java.util.Vector
class java.util.Date
这样就获得了Vector里边的类型
*/
}
public static void applyVector(Vector<Date> v1) {
}
/* 下边的不是重载,编译后就会去掉泛型
* public static void applyVector(Vector<Integer> v1) {
}*/
}