JAVA泛型的使用

泛型技术在C#和Java之中的使用方式看似相同,但实现上却有着根本性的分歧,C#里面泛型无论在程序源码中、编译后的IL中(Intermediate Language,中间语言,这时候泛型是一个占位符)或是运行期的CLR中都是切实存在的,List<int>与List<String>就是两个不同的类型,它们在系统运行期生成,有自己的虚方法表和类型数据,这种实现称为类型膨胀,基于这种方法实现的泛型被称为真实泛型。
Java语言中的泛型则不一样,它只在程序源码中存在,在编译后的字节码文件中,就已经被替换为原来的原始类型(Raw Type,也称为裸类型)了,并且在相应的地方插入了强制转型代码,因此对于运行期的Java语言来说,ArrayList<int>与ArrayList<String>就是同一个类。所以说泛型技术实际上是Java语言的一颗语法糖,Java语言中的泛型实现方法称为类型擦除,基于这种方法实现的泛型被称为伪泛型。(类型擦除在后面在学习)
使用泛型机制编写的程序代码要比那些杂乱的使用Object变量,然后再进行强制类型转换的代码具有更好的安全性和可读性。泛型对于集合类来说尤其有用。

在使用泛型之前,先了解下泛型的几个基本概念,以ArrayList<E>和ArrayList<Integer>做简要介绍:
整个成为ArrayList<E>泛型类型
ArrayList<E>中的 E称为类型变量或者类型参数
整个ArrayList<Integer> 称为参数化的类型
ArrayList<Integer>中的integer称为类型参数的实例或者实际类型参数
·ArrayList<Integer>中的<Integer>念为typeof Integer
ArrayList称为原始类型

泛型的使用

泛型有以下三种,分别是泛型类、泛型接口和泛型方法

1.泛型类

1.1简单泛型类的使用

泛型类就是具有一个或多个类型变量的类,泛型类是在多个方法签名间实施类型约束。在 List<V> 中,类型参数 V 出现在 get()、add()、contains() 等方法的签名中。当创建一个 Map<K, V> 类型的变量时,您就在方法之间宣称一个类型约束。您传递给 add() 的值将与 get() 返回的值的类型相同。泛型类的使用很简单,如下

class Pair<T> { 
 
    private T value;  
        public Pair(T value) {  
                this.value=value;  
        }  
        public T getValue() {  
        return value;  
    }  
    public void setValue(T value) {  
        this.value = value;  
    }  
}  

使用的时候我们可以这样定义Pair<String> pair=new Pair<String>("Hello");
Pair类引入了一个类型变量T,用尖括号<>括起来,并放在类名的后面。泛型类可以有多个类型变量。例如,可以定义Pair类,其中第一个域和第二个域使用不同的类型:public class Pair<T,U>{......}

1.2泛型返回类型的方法

下面的代码列举了使用一个在普通类ArrayAlg中返回类型为泛型的方法minmax,用其来获取字符串数组words中的字符串字典排序。

class ArrayAlg  
{  
   public static Pair<String> minmax(String[] a)  
   {  
      if (a == null || a.length == 0) return null;  
      String min = a[0];  
      String max = a[0];  
      for (int i = 1; i < a.length; i++)  
      {  
         if (min.compareTo(a[i]) > 0) min = a[i];  
         if (max.compareTo(a[i]) < 0) max = a[i];  
      }  
      return new Pair<String>(min, max);  
   }  
} 

2.泛型接口

interface Show<T,U>{  
    void show(T t,U u);  
}  
  
class ShowTest implements Show<String,Date>{  
    @Override  
    public void show(String str,Date date) {  
        System.out.println(str);  
        System.out.println(date);  
    }  
}  

3.泛型方法

泛型方法是因为您想要在该方法的多个参数之间宣称一个类型约束。如下:

3.1普通类中的泛型方法

public class Pair    
{    
       public static <T> T getMiddle(T[] b) {  
           return b[b.length/2];  
        } 
    
  }

这个方法是用在普通类中定义的,而不是用在泛型类中定义。但是,这是一个泛型方法,这一点可以从尖括号和类型变量中看出来。 需要注意的是,类型变量放在修饰符的后面,返回类型的前面。当然泛型方法可以定义在普通类中,也可以定义在泛型类中。
泛型方法的调用

String[] names = { "mmj", "geeeeg.", "sa" };  
String middle = ArrayAlg.<String>getMiddle(names);  

在这种情况下,方法调用中可以省略掉<String>类型参数。编译器有足够的信息来判断出多调用的方法。它用的names的类型(即String[ ]类型)与泛型类型T[ ]进行匹配,并且判断出T一定是String。也就是说String middle = ArrayAlg.getMiddle(names)也是对的

3.2泛型类中的泛型方法

public class Pair<T>     
{        
   public Pair() { first = null; second = null; }    
   public Pair(T middle){ this.middle = middle;} 
   //泛型方法
   public T getSth1<T>(T t)
    {
          return t;
    }
     public void getSth2<T>(T t)
    {
    }
  
    //非泛型方法
   public T getMiddle(){return middle;}  
    
   private T middle;    
   public T length;   //length要用public或者默认访问修饰符  
}  

3.3泛型返回类型的泛型方法

class ArrayAlg  
{  
     public static <T> Pair<T> getMiddle(T[] b)  //这里的泛型方法返回类型为Pair<String>  
     {  
         return new Pair<T>(b[b.length / 2]);  //b[b.length / 2]是T[]类型,所以无需强制类型转换。  
     }  
}  

调用如下String[] names = { "mmj", "geeeeg.", "sa" };
Pair<String> middle = ArrayAlg.<String>getMiddle(names);
//如前所述Pair<String> middle = ArrayAlg.getMiddle(names);也可以。
参考:
1.http://blog.csdn.net/zzy7075/article/details/50467089##3

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

推荐阅读更多精彩内容

  • 泛型的概念 泛型,本质是参数化类型,这个概念在程序设计里面很经常可以看到,泛型的使用很灵活而且高效,它允许程序员将...
    MarcoHorse阅读 248评论 0 0
  • 引言:泛型一直是困扰自己的一个难题,但是泛型有时一个面试时老生常谈的问题;今天作者就通过查阅相关资料简单谈谈自己对...
    cp_insist阅读 1,835评论 0 4
  • Why ——引入泛型机制的原因 假如我们想要实现一个String数组,并且要求它可以动态改变大小,这时我们都会想到...
    absfree阅读 5,097评论 1 6
  • 泛型是Java 1.5引入的新特性。泛型的本质是参数化类型,这种参数类型可以用在类、变量、接口和方法的创建中,分别...
    何时不晚阅读 3,023评论 0 2
  • 时间:2015.11.27 21:30-22:10进度:整套申论模拟试题书摘:1.“万能八条”内容:一、领导重视、...
    MissBao88阅读 79评论 0 0