泛型

------- android培训java培训、期待与您交流! ----------


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)

{

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值