java--泛型

##泛型
##一,在具体使用时,可以分为泛型接口、泛型类和泛型方法。

- 1,泛型的好处:
    是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率。
- 2,在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,
- 3,命名泛型字母可以随意指定,尽量使用单个的大写字母(有时候多个泛型类型时会加上数字,比如T1,T2)
   常见字母(见名知意)
    T Type
    K V Key Value
    E Element
- 4, 泛型不能使用在静态属性上


##二,泛型类

    class Gen<T> {
    private T ob; // 定义泛型成员变量
 
    public Gen(T ob) {
        this.ob = ob;
    }
 
    public T getOb() {
        return ob;
    }
 
    public void setOb(T ob) {
        this.ob = ob;
    }
 
    public void showType() {
        System.out.println("T的实际类型是: " + ob.getClass().getName());
    }
    }

    
        Gen<Integer> intOb = new Gen<Integer>(88);
        intOb.showType();
        int i = intOb.getOb();
        Log.e("date","value= " + i);
       
        // 定义泛型类Gen的一个String版本
        Gen<String> strOb = new Gen<String>("Hello Gen!");
        strOb.showType();
        String s = strOb.getOb();
        Log.e("date","value= " + s);



    


- K,V类型
 

   public class ResultMap<K,V> {
        private K key;
        private V value;
        //省略 set ,get  方法

        public void put(K key,V value){
                this.key=key;
                this.value=value;
            }
        }



- 使用
     

   ResultMap<String,User> resultMap=new ResultMap<>();
   resultMap.put("currentUserKey", new User());






##三,泛型方法

    public class JsonUtil {
    
    public <T> T  str2Json(String jsonText,Class target){
        T result=null;
        //....parse to json 
        return result;
    }
    }




##四,<? extend E> 和<? super E>

- 1,< ? extends E >
    1.1,List < ? extends A > 表示 这个list里面存的是A的子类,具体是啥不知道,只知道范围! 
    那可以设定分两个范围: A子类,A父类。 


    1.2,对于add: 
        A子类情况:如果你允许add的元素是A的子类,那么因为泛型参数限定? extends A, 所以ArrayList可以指定的类型也是A的子类,那么无法保证add的对象一定ArrayList指定类型的子类对象,

        比如: ArrayList指定C, list却add了A()对象–这就是非法的!(因为list并不知道指定了C,它可以确定的范围就是可以add所有A的子类。)

       所以A子类该范围不行! A父类情况:ArrayList指定类型肯定实在(?,A]范围内,所以这种情况肯定不行!


    1.3,对于get: 
    list不知道你存入ArrayList是什么类型,但是我可以确定使用A的引用肯定可以接受ArrayList中的元素(无论ArrayList设定什么类型),因为A肯定是里面元素的父类!但是你使用其他类型接受就不行了,因为如果ArrayList的类型是你指定的那个类型的父类,是接受不了的。


- 2,< ? super E >
    2.1,List < ? super C > 表示list里面存的是C和其父类,具体是啥不确定,只知道范围。同样的分为:C子类,C父类。(其实应该发现了没必要分为两类,有一类是肯定不行的)。 


    2.2,add: 
     C子类:如果允许add,就允许list来add任何C的子类元素,因为ArrayList指定的范围是C和其父类,所以ArrayList可以准确接受该假设范围的所有对象。 所以,C子类这个范围可行,这样就有一个标准的类型判断依据,不像extends,根本无法确定判断标准,编译器就不会知道怎么做。 
      C父类:显然和上面A子类情况是一样的!因为list无法知道ArrayList指定类型 ,所以无法确定判断标准。 


    2.3, get: 
     因为list只允许add C的子子类对象,你或许也在想:那我直接用C不就可以接受ArrayList数据吗?并不是的,ArrayList在赋给list之前可能里面已经有值了,这个值的类型如果是ArrayList指定类型,并且是C的父类,那么C就无法接受! 而且list不知道ArrayList会指定哪个类型,只知道范围,所以无法确定是哪个父类,所以干脆用Object那肯定就能接受了,所以返回的其实只有Object能接受,否则就得强转。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值