对java中泛型的理解

1. 所有反射的操作都是在运行时的,一般程序会采取去泛型化的操作。

也就是说Java中的泛型只是在编译阶段有效,在编译过程中,正确检验泛型结果后,会将泛型的相关信息抹掉,并且在对象进入和离开方法的的时候添加类型检查和类型转换的方法,通俗的说就是成功编译过后的class文件中是不包含任何泛型信息的。

List<String> list = new ArrayList <String>();
list.add("String");
Class clazz = list.getClass();
try {
    Method method = clazz.getMethod("add",Object.class);
    method.invoke(list,100);
} catch (IllegalAccessException e) {
    e.printStackTrace();
} catch (InvocationTargetException e) {
    e.printStackTrace();
}
System.out.println(list);    //结果是:[String, 100]

这个例子绕过了编译,也就是绕过了泛型。

2.

class FX<T>{
    private T ob;

    public FX(T ob) {
        this.ob = ob;
    }

    public T getOb() {
        return ob;
    }

    public void setOb(T ob) {
        this.ob = ob;
    }
}
//通配符
     FX<Number> ex_num = new FX<Number>(100);
     FX<Integer> ex_int = (FX <Integer>) getDate(ex_num);
     getDate(ex_int);
     getDate(ex_num);

 }
 /**
  * 通配符
  */
/* public static FX<?> getDate(FX<?> temp){
     System.out.println(temp.getOb());
     return temp;
 }*/
 public static FX<? extends Number> getDate(FX<? extends Number> temp){
     System.out.println("class type:" + temp.getClass());
     return temp;
 }

限定通配符:FX<? extends T>  类型必须是T类型或者T的子类; FX<? super T>类型必须是T类型或者T 的父类。

非限定通配符:FX<?> 可以用任意类型来替代。

转载于:https://my.oschina.net/u/3738404/blog/1931607

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值