欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java 泛型全解析

程序员文章站 2024-01-24 12:35:46
泛型简介什么是泛型? 参化类型,数是jdk1.5的新特性。(定义泛型时使用参数可以简单理解为形参),例如list,map 编译时的一种类型,此类型仅仅在编译...

泛型简介

什么是泛型?

  • 参化类型,数是jdk1.5的新特性。(定义泛型时使用参数可以简单理解为形参),例如list<e>,map<k,v>
  • 编译时的一种类型,此类型仅仅在编译阶段有效,运行时无效.例如list<string>在运行时string会被擦除,最终系统会认为都是object.

为什么要使用泛型?

泛型是进行类型设计或方法定义时的一种约束规范,基于此规范可以:

  1. 提高编程时灵活性(有点抽象,后续结合实例理解)。
  2. 提高程序运行时的性能。(在编译阶段解决一些运行时需要关注的问题,例如强转)

说明:泛型应用相对比较简单,难点在泛型类或方法的设计上,通过这样的设计如何对现有类进行减法设计,提高类或方法的通用性.

泛型应用类型

泛型定义时常用方式有三种(可参考list<e>,map<k,v)等接口定义):

  1. 泛型类:class 类名<泛型,…>{}
  2. 泛型接口:interface 接口名<泛型,…>{}
  3. 泛型方法: <泛型> 方法返回值类型 方法名(形参){}

泛型类定义及应用

类泛型定义:(用于约束类中方法参数和方法返回值类型)

class array<t>{//类泛型:类名<泛型>
  object[] array=new object[10];
  public void add(t t){}//通过类泛型约束方法参数类型
  public t get(int i){//通过类泛型约束方法返回值类型
    return (t)array[i];
  }
}

泛型接口定义及应用

定义接口时指定泛型,用于约束接口方法参数类型以及方法返回值类

interface task<param,result>{//思考map中的泛型map<k,v>
  /**
   * 此方法用于执行任务
   * @param arg 其类型由泛型参数param决定
   * @return 其类型由泛型参数result决定
   */
  result execute(param arg);
}

泛型接口应用实践

class converttask implements task<string,integer>{
  @override
  public integer execute(string arg) {
    // todo auto-generated method stub
    return integer.parseint(arg);
  }
}

泛型定义及应用

泛型方法中的泛型仅仅应用于当前方法,主要应用于一些静态方法,当然非静态方法也可以应用。

class objectfactory{
  /**泛型方法*/
  public static <t>t newinstance(class<t> cls){
    return (t)cls.newinstance();
  }
}

泛型应用通配符应用

*限定通配符

泛型*通配符使用”?”进行表示,可以代表一种任意参数类型(实参类型)。一般应用于变量的定义。例如:class<?> c1;

class<?> c=class.forname("java.util.date");

上届界限定通配符

泛型上届限定符通过“<? extends 类型>”方式进行实现,主要用于方法参数或方法的返回值类型,例如:

static void doprint(list<? extends charsequence> list){
    system.out.println(list);
}

下届限定通配符

泛型下届限定符通过“<? super 类型>”方式进行实现,主要用于方法参数或方法的返回值类型,例如:

static void doprint(set<? super integer> set){
    system.out.println(list);
}

泛型类型擦除实践分析

泛型是编译时的一种类型,在运行时无效,运行时候都会变成object类型,例如:

arraylist<string> list = new arraylist<string>();
list.add("a");
//list.add(100);//直接不可以
//通过反射将100添加到集合
list.getclass().getmethod("add", object.class).invoke(list, 100);
system.out.println(list);

总结(summary)

本小节对泛型的定义,应用场景,应用类型以及泛型的类型擦出进行了分析和实践,希望在后续项目实践中对泛型有一个更好的认识。

以上就是java 泛型全解析的详细内容,更多关于java 泛型的资料请关注其它相关文章!

相关标签: Java 泛型