1.
2.在JDK1.5中,仍然可以将不同类型的对象放入同一个集合中,但是编绎器会报UNCHECKED警告。对于该警告,可采用注解消除。
a) @SuppressWarnings("unchecked") __加在主函数上
3.
4.利用反射将不同类型的元素添加到泛型集合中
List<Integer> a2=new ArrayList<Integer>();
a2.add(1);
// a2.add("abc");
// a2.add(1L);
int i=a2.get(0);
a2.getClass().getMethod("add", Object.class).invoke(a2, "abc");
System.out.println(a2.get(1));
5.了解泛型
关于思考题,编绎器只考虑编绎时的语法检查,并不会考虑运行时的情况。
Vector v1=new Vector<String>();
Vector<Object> v2=v1;
v2.add("abc");
v2.add(new Object());
System.out.println(v2.get(0));
System.out.println(v2.get(1));
Vector<Object> v3=new Vector<String>(); //报错
6.?通配符
a) 使用?通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,可以调用参数化无关的方法,不能调用与参数化有关的方法。
b) 上限 ? Extends XXX
c) 下限 ? Super XXX
d) 限定符总是包括它自己。
7.泛型集合的应用
Map<Integer,String> map=new HashMap<Integer,String>();
map.put(1, "abc");
map.put(2, "def");
map.put(3, "ghi");
Set<Entry<Integer, String>> entrySet=map.entrySet();
for(Map.Entry<Integer, String> entry:entrySet)
{
System.out.println(entry.getKey()+":"+entry.getValue());
}
8.
9.泛型方法
a)
public static <T> void swap(T[] arr,int x,int y)
{
T temp=arr[x];
arr[x]=arr[y];
arr[y]=temp;
}
int[] intArr=new int[]{1,2,3,4,5};
swap(intArr,0,4); //报错,只有引用类型才勇气作为泛型方法的实际参数
String[] strArr=new String[]{"abc","def","ghi"};
swap(strArr,0,2);
TIP:只有引用类型才可以作为泛型方法的实际参数。对于ADD方法,使用基本类型进行测试没有问题,这是因为已经自己装箱和拆箱了。SWAP(INTARR,0,4),语句会报告编绎错误,这是因为编绎器不会对NEW INT[]{1,2,3,4,5},即INTARR进行自动装箱和拆箱了,因为NEW INT[]{1,2,3,4,5}本身已经是对象了,你想要的可能就是INT数组呢?它岂不是弄巧成拙了?
b) 除了在应用泛型时可以使用限定符,在定义泛型方法的时候也可以使用泛型限定符。例如Class.getAnnotation()方法的定义。
public <A extends Annotation> A getAnnotation(Class<A> annotationClass){...}
并且可以用&来指定多个边界。如:
<V extends Serialiable & cloneble> void Method(){}
c)普通方法,构造方法,静态方法中都可以使用泛型。编绎器不允许创建类型变量的数组。
d)可以用类型变量来表示异常,称为参数化的异常,可以用于方法THROWS列表中,但是不能用于CATCH子句中
e)在泛型中可以同时有多个类型参数,在定义它们时用逗号分隔,如:
Public static <K,V> getValue(K key){return map.ger(key);}
f)编绎器判断泛型方法的实际类型参数的过程称为类型推判,类型推判是相对于知觉推判的,其实现方法是一个非常复杂的过程。
public static <T> void cpy1(Collection<T> des,T[] src){} //传播性
public static <T> void cpy1(T[] des,T[] src){} //取最小范围的共性类型,会进行类型推断
g)根据调用泛型方法时实际传递的参数类型或返回值的类型来推判,具体规则如下:
10.泛型类
a)
Dao 数据访问对象
b)
c)public class GenericDao<T>
{
public void add(T t)
{
}
@SuppressWarnings("hiding")
public <T> void del(int id)
{
}
public void upt(T t)
{
}
//方法级别泛型,与类无关
public static <T> void upt2(T t)
{
}
public T selById(int id)
{
T t = null;
return t;
}
public Set<T> findByConditions(String where)
{
return null;
}
}
11.通过反射获得泛型的实际类型参数
//通过反射获得方法,再获得方法中的参数化类型即可实现
public static void GenericArg() throws Exception
{
Method applyMethod=GenericTest.class.getMethod("applyVector",Vector.class);
Type[] typies=applyMethod.getGenericParameterTypes();
ParameterizedType pt=(ParameterizedType)typies[0];
System.out.println(pt.getRawType());
for(Type type:typies)
{
System.out.println(type);
}
}
public static void applyVector(Vector<Date> v)
{
}