java 泛型

泛型是jdk1.5使用的新特性。

泛型的好处:
  1. 将运行时的异常提前至了编译时。
  2. 避免了无谓的强制类型转换 。
泛型在集合中的常见应用:
ArrayList<String>  list = new ArrayList<String>();  true    推荐使用。

ArrayList<Object>  list = new ArrayList<String>();  false   前后类型不一致

ArrayList<String>  list = new ArrayList<Object>();  false   前后类型不一致

//以下两种写法主要是为了兼顾新老系统的兼用性问题。
ArrayList<String>  list = new ArrayList();     true   

ArrayList  list = new ArrayList<String>();   true   

注意

  • 泛型没有多态的概念,左右两边的数据 类型必须 要一致,或者只是写一边的泛型类型。
  • 基本数据类型是没有泛型这个概念的

推荐使用: 两边都写泛型。

需求:

把一个集合中元素全部转成大写。

public class Demo1 {

    public static void main(String[] args) {
        ArrayList<String>  list = new ArrayList<String>();  //<String> 表示该容器只能存储字符串类型 的数据。
        
        list.add("aa");
        list.add("bb");
        list.add("cc");
        
        for(int i = 0 ; i < list.size() ; i++){
            String str =  list.get(i);
            System.out.println("大写:"+ str.toUpperCase());
        }

        /**
        与老系统的兼容测试
        */
        MyUtil.print(list);
        ArrayList<String> list2 = MyUtil.getList();
    }
}

//是老程序员写 的。  jdk1.4的时候写的。
class MyUtil {
    
    public static ArrayList getList(){
        return new ArrayList();//接收的引用可能使用了泛型
    }
    
    public static void print(ArrayList list){//传过来的对象可能使用了泛型
        for (int i = 0; i < list.size() ; i++) {
            System.out.println(list.get(i));
        }
    }
}
泛型类:

泛型类的定义格式

class 类名<声明自定义泛型>{

}

泛型类要注意的事项

  1. 在类上自定义泛型的具体数据类型是在使用该类的时候创建对象时候确定的。
  2. 如果一个类在类上已经声明了自定义泛型,如果使用该类创建对象 的时候没有指定 泛型的具体数据类型,那么默认为Object类型
  3. 在类上自定义泛型不能作用于静态的方法,如果静态的方法需要使用自定义泛型,那么需要在方法上自己声明使用。

需求: 编写一个数组 的工具类

class MyArrays<T>{
    
    //元素翻转
    public void reverse(T[] arr){ //这样方法就不需要做泛型的声明了 public <T>void reverse(T[] arr)
        for(int startIndex = 0, endIndex = arr.length-1 ; startIndex<endIndex ; startIndex++,endIndex--){
            T temp  = arr[startIndex];
            arr[startIndex] = arr[endIndex];
            arr[endIndex] = temp;
        }
        
    }
    
    
    public String toString(T[] arr){
        StringBuilder sb = new StringBuilder();
        for(int i = 0 ; i < arr.length ; i++){
            if(i==0){
                sb.append("["+arr[i]+",");
            }else if(i==arr.length-1){
                sb.append(arr[i]+"]");
            }else{
                sb.append(arr[i]+",");
            }
        }
        return sb.toString();
    }
    
    public static <T>void print(T[] t){ //静态方法如果要使用泛型,还是需要做泛型声明
            
    }

}

public class Demo3 {
    
    public static void main(String[] args) {
        Integer[] arr = {10,12,14,19};
        
        MyArrays<Integer> tool = new MyArrays<Integer>();
        tool.reverse(arr);
        System.out.println("数组的元素:"+tool.toString(arr));
        
        MyArrays<String> tool2 = new MyArrays<String>();
        String[] arr2 = {"aaa","bbb","ccc"};
        tool2.reverse(arr2);
        
        ArrayList<String> list = new ArrayList<String>();   
    }
}
泛型接口

泛型接口的定义格式:

interface 接口名<声明自定义泛型>{

}

泛型接口要注意的事项:

  1. 接口上自定义的泛型的具体数据类型是在实现一个接口的时候指定的。
  2. 在接口上自定义的泛型如果在实现接口的时候没有指定具体的数据类型,那么默认为Object类型。

需求: 目前我实现一个接口的时候,我还不明确我目前要操作的数据类型,我要等待创建接口实现类 对象的时候我才能指定泛型的具体数据类型。

如果要延长接口自定义泛型 的具体数据类型,那么格式如下:

public class Demo4<T> implements Dao<T>{
        
}
interface Dao<T>{
    
    public void add(T t);   
}

//public class Demo4 implement Dao<String>//在实现这个接口的时候就指定泛型类型

public class Demo4<T> implements Dao<T> { //现在实现接口的时候我还不想指定这个泛型类型,想在实例化该类的时候再指定;

    public static void main(String[] args) {
        Demo4<String> d = new Demo4<String>();
    }

    public void add(T t){
        
    }
}
泛型的上下限:

需求1: 定义一个函数可以接收接收任意类型的集合对象, 要求接收的集合对象只能存储Integer或者是Integer的父类类型数据。

需求2: 定义一个函数可以接收接收任意类型的集合对象, 要求接收的集合对象只能存储Number或者是Number的子类类型数据。

泛型中通配符: ?

? super Integer : 只能存储Integer或者是Integer父类元素。 泛型 的下限

? extends Number : 只能存储Number或者是Number类型的子类数据。 泛型上限

public class Demo5 {

    public static void main(String[] args) {
        ArrayList<Integer> list1 = new ArrayList<Integer>();
        ArrayList<Number> list2 = new ArrayList<Number>();
        
        HashSet<String> set = new HashSet<String>();
        //getData(set);
        
    }
    
    //泛型的上限
    public static void getData(Collection<? extends Number> c){
        
    }
    
    //泛型的下限
    public static void print(Collection<? super Integer> c){
        
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容

  • 开发人员在使用泛型的时候,很容易根据自己的直觉而犯一些错误。比如一个方法如果接收List作为形式参数,那么如果尝试...
    时待吾阅读 1,042评论 0 3
  • 我们知道,使用变量之前要定义,定义一个变量时必须要指明它的数据类型,什么样的数据类型赋给什么样的值。 假如我们现在...
    今晚打肉山阅读 974评论 0 1
  • 什么是泛型 泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化...
    不知名的蛋挞阅读 454评论 0 1
  • 1.知识和技能:相对较容易习得,但有局限,即只能只能在特定领域使用。 2.通用能力:有学习门槛,是个人今后跨行业迁...
    路痴鱼阅读 2,088评论 0 0
  • 卧拥冷衾阅经典,夜雨初渡月朝安。 不到水空消息断,泪珠翻滚已忘言。 在一个寒冷的夜晚,我终于读完了这本旷世经典小说...
    夙音阅读 559评论 0 0