java——中泛型的应用

在解释泛型的时候先说下java中的可变参数的定义和应用。
定义:参数的类型... 参数名称
示例:

public class Demo{
 public static void main(String args[]){
     System.out.println(count(1,2,2,3,4));
 } 
 public static int count(int... temp){//使用可变参数的形式完成需求
     int sum=0;
     for(int i=0;i<temp.length;i++){
        sum+=temp[i];
     }
     return sum;
 }

  ```
泛型:java的一个新特性,相当于是一个标签。在集合中大量使用。
在定义一个类的时候如果无法确定某些参数的类型的时候,可以先不去确定参数的类型,先使用一个占位符<T>的形式表示参数类型。等创建对象的时候再具体确定参数的形式。泛型的出现是为了让运行时的错误在编译时体现出来。让开发跟快捷。
为什么要用泛型:

package com.zhaoqiang.paradigm;

import java.util.ArrayList;

/*

  • 泛型:
  • 需求:把一个集合中元素全部转成大写
  • */

public class Demo1 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("aa");
list.add("bb");
list.add("cc");
list.add(123);

    for (int i = 0; i < list.size(); i++) {
        String str = (String)list.get(i);
        System.out.println("大写"+str.toUpperCase());
    }
}

}

上面的代码出现了一个异常“ClassCastExcepton”,出现这个异常的根本原因就是int 类型的数据不能转换成String类型的数据。所有我们需要避免这种错误发生在运行时(如果你不声明泛型,项目内开发的时候,其他人很难知道你这个集合存放的是什么数据类型)
示例:

package com.zhaoqiang.paradigm;

import java.util.ArrayList;

/*

  • 泛型:
  • 需求:把一个集合中元素全部转成大写
  • */

public class Demo1 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("aa");
list.add("bb");
list.add("cc");
list.add(123);

    for (int i = 0; i < list.size(); i++) {
        String str = list.get(i);
        System.out.println("大写"+str.toUpperCase());
    }
}

}

上面的代码在编辑的时候就会出现错误(安全警告),因为这个时候集合中只能存放String类型的数据。也避免了无谓的强制类型转换。
  下面介绍一下方法上定义泛型:
    修饰符 <声明自定义的泛型> 返回值类型 函数名(使用自定义泛型){}
示例:

package com.zhaoqiang.paradigm;

/*

  • 需求:定义一个方法可以接受任意类型的参数,而且返回值类型必须要与实际参数一致。
  • 自定义泛型:
  •  自定义泛型就是一个数据类型的占位符或者是一个数据类型的变量
    
  • 在方法上自定义泛型:
  •  修饰符 <声明自定义的泛型>  返回值类型 函数名(使用自定义泛型){
    
  •  }
    
  • 注意:在泛型中不能使用基本数据类型,如果需要使用基本数据类型,那么久使用基本数据类型对于的包装类型。
  • byte --- Byte
  • short -- Short
  • int ---- Integer
  • long --- Long
  • double - Double
  • float -- Float
  • char --- Character
  • boolean - Boolean
  • 方法泛型注意事项:
  •  1,在方法上自定义泛型,这个自定义泛型的具体数据类型是在调用该方法的时候传入实参是确定。
    
  •  2,自定义泛型只要符合标识符的命名规则即可。但是一般习惯自定义泛型的时候使用一个大写字母表示(T(Type),E(Element))
    
  • */

class Person<T>{

public T say(T t){
    return t;
}

}

public class Demo2 {
public static void main(String[] args) {
String str = getData("abc");
System.out.println(str.toUpperCase());
}

public static <T>T getData(T t){
    return t;
}

    public static <T>Person getInfo(Person<T> p){
      return p;
    }

public static void getInfo(Person<Integer> p){
    System.out.println(p);
}

public static String getInfo(Person<String> p){
    return p.say("hah");
}

}

  上面的泛型类型是在使用的时候(调用的时候确定泛型的数据类型).
如果一个类里面很多个方法都要用到泛型。我们可以定义一个泛型类:
  class 类名<泛型>{}
示例:

class MyArrays<T>{

// 元素翻转
public 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){
    
    StringBuffer sb = new StringBuffer();
    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,15,48,456,742};
MyArrays<Integer> marr = new MyArrays<Integer>();
marr.reverse(arr);
System.out.println(marr.toString(arr));
}
}

通过上面的代码可以证明开始说的那句话,在类上定义泛型的具体数据类型是在使用该类创建对象的时候确定的。【注】泛型没有重载。
  泛型的上限和下限:
 上限:<? extends T>
  一旦在方法中指定了泛型的上限,那么该方法只能接收上限所对应的类的子类类型的泛型或者上限对应的本类类型。
 下限:<? super T>
一旦设置了下限,那么方法所接受的类型必须是下限所对应的父类及本类类型。
示例:

public class Demo5 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
ArrayList<Number> list2 = new ArrayList<Number>();

    print(list);
    print(list);
    
    
    HashSet<String> set = new HashSet<String>();
    ArrayList<String> set1 = new ArrayList<String>();
    printl(set1);
    printl(set);
}

// 泛型的下限
public static void print(Collection<? super Integer> c){
    
}

// 泛型的下限
public static void printl(Collection<? extends String> c){
    
}

}

泛型接口:

interface IAction<T>{//定义一个泛型接口
public T count(T t);
}
class Action<T> implements IAction<T>{
public T count(T t){
return t;
}
}
public class Demo {
public static void main(String[] args) {
System.out.println( new Action<Double>().count(12.0));
}
}

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

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,970评论 6 13
  • 我们知道,使用变量之前要定义,定义一个变量时必须要指明它的数据类型,什么样的数据类型赋给什么样的值。 假如我们现在...
    今晚打肉山阅读 982评论 0 1
  • 一、泛型概述 --->JDK1.5新特性 1、泛型的出现: 1、泛型是在JDK1.5以后出现的新特性。泛型是用于解...
    玉圣阅读 905评论 0 0
  • 前言 前端的工作并不仅仅是实现「视觉&交互稿」,想要开发一个高性能易维护的「完美」站点并未易事,针对前端的性能优化...
    木羽zwwill阅读 636评论 0 4
  • 张爱玲说:“因为懂得,所以慈悲。”懂得一词,是将心比心,体贴入微,因为情感是人世间最为柔软的东西,需要用心呵...
    方圆_22cf阅读 216评论 0 0