java 泛型

泛型

在java中,像List, Map, Set等容易经常使用到,而且给我们编码带来了很大的便利,比如List<String> 我们就能够得到一个String的List容器,List<Integer> 就能够产生出一个Integer的List容器,这其中就用到了泛型。泛型就是参数化类型:

  1. 适用于多种数据类型执行相同的代码
  2. 泛型中的类型在使用时指定
  3. 泛型归根到底就是“模版”
    优点:使用泛型时,在实际使用之前类型就已经确定了,不需要强制类型转换。
    泛型既可以修饰类,也可以修饰方法和接口。这里举个例子。
public class Test1<T>{

    public  void testMethod(T t){
        System.out.println(t.getClass().getName());
    }
    public  <E> E testMethod1(E e){
        return e;
    }
  public static void main(String[] args) {
    Test1<String> t = new Test1();
    t.testMethod("generic");
    Integer i = t.testMethod1(new Integer(1));
  }
}

上面代码中,Test1<T> 是泛型类,testMethod 是泛型类中的普通方法,而 testMethod1 是一个泛型方法。而泛型类中的类型参数与泛型方法中的类型参数是没有相应的联系的,泛型方法始终以自己定义的类型参数为准。

之前写过一篇C++的模板https://www.jianshu.com/writer#/notebooks/15612794/notes/16915027,其实是同种意思,这里不再赘述。

类型擦除

先来一道有意思的题

List<String> l1 = new ArrayList<String>();
List<Integer> l2 = new ArrayList<Integer>();

System.out.println(l1.getClass() == l2.getClass());

  泛型是 Java 1.5 版本才引进的概念,在这之前是没有泛型的概念的,为了与以前的代码兼容,java使用了类型擦除。泛型信息只存在于代码编译阶段,在进入 JVM 之前,与泛型相关的信息会被擦除掉,专业术语叫做类型擦除。
  所以上面的题的结果是true, List<String> 和 List<Integer> 在 jvm 中的 Class 都是 List.class。类型 String 和 Integer被替换成 Object 类型。
下面将使用反射来进行验证。

package com.frank.test;
public class Erasure <T>{
    T object;

    public Erasure(T object) {
        this.object = object;
    }

}
import com.frank.test.Erasure;
public class Test {
    public static void main(String[] args) {
      Erasure<String> erasure = new Erasure<String>("hello");
      Class eclz = erasure.getClass();
      System.out.println("erasure class is:" + eclz.getName());
      Field[] fs = eclz.getDeclaredFields();
      for ( Field f : fs)  {
        System.out.println("Field name "+f.getName()+" type:"+f.getType().getName());
    }
  }
}

打印结果

erasure class is:com.frank.test.Erasure
Field name object type:java.lang.Object

通配符

类型被擦除了,就不能用父类类型来表示子类了。但是,在现实编码中,确实有这样的需求,希望泛型能够处理某一范围内的数据类型,比如某个类和它的子类,对此 Java 引入了通配符这个概念。
通配符有 3 种形式。
<?> 被称作无限定的通配符。
<? extends T> 被称作有上限的通配符。
<? super T> 被称作有下限的通配符。
<?>:只保留了所有类型的通用功能。比如下面代码

List<?> wildlist = new ArrayList<String>();
wildlist.add("123");// 编译不通过

wildlist丧失了add功能,它不管装载在这个容器内的元素是什么类型,它只关心元素的数量、容器是否为空。
<? extends T> :使用父类T来表示它的子类类型,上界<? extends T>影响写,但是不影响读。编译器只知道容器内是T或者它的派生类,但具体是什么类型不知道,而是标上一个占位符CAP#1。往容器里面写时,T的子类通常要会比父类多加方法和变量等,要比T粒度要大, 类编译器都不知道能不能和这个CAP#1匹配,所以就都不允许。

image.png

<? super T> :使用T的父类类型。下界<? super T>不影响写,但读只能放在Object对象里。因为下界规定了元素的最小粒度的下限,实际上是放松了容器元素的类型控制。既然元素是T的父类,那往里存粒度比T小的都可以。但往外读取元素就费劲了,只有所有类的基类Object对象才能装下。但这样的话,元素的类型信息就全部丢失。
image.png

参考:
[1]. https://blog.csdn.net/briblue/article/details/76736356
[2]. https://www.cnblogs.com/zhaoyibing/p/9051428.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354