JDK5以前,对象保存到集合中就会失去其特性,取出时通常要程序员手工进行类型的强制转换,这样不可避免的就会引发程序的一些安全性问题。例如:

 ArrayList list = new ArrayList();
list.add("abc");
Integer num = (Integer) list.get(0); list.addAll(new Random());
list.add(new ArrayList());
for(int i = 0;i<list.size();i++){
(?)list.get(i);

JDK5中的泛型允许程序员在编写集合代码时,就限制集合的处理类型,从而把原来程序运行时可能发生问题,转变为编译时的问题,以此提高程序的可读性和稳定性(尤其在大型程序中更为突出)。

注意:泛型是提供给javac编译器使用的,它用于限定集合的输入类型,让编译器在源代码级别上,即挡住向集合中插入非法数据。但编译器编译玩带有泛型的java程序后,生成的class文件中将不再带有泛型的信息,以此使程序运行效率不受到影响,这个过程称之为“擦除”。

泛型的基本术语,以ArrayList<E>为例:<>念着typeof

ArrayList<E>中的E称之为类型参数变量。

ArrayList<Integer>中的Integer称为实际类型参数

整个称为ArrayList<E>泛型类型

整个ArrayList<Integer>称为参数化的类型ParameterizedType

泛型的典型应用

使用迭代器迭代泛型集合中的元素。

使用向增强for循环迭代泛型集合中的元素

存取HashMap中的元素

使用泛型时的几个常见问题:

使用泛型时,泛型类型必须为引用类型,本能是基本数据类型。

一旦用到了泛型,两边的类型要一致或者两边只用一边。

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

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

ArrayList<String> list = new ArrayList();

ArrayList list = new ArrayList<String>();

这些都是使用JDK里面别人编好的类型,如何自己定义泛型??

Java程序中的普通方法、构造方法和静态方法中都可以使用泛型。方法使用泛型之前,必须对泛型进行声明,语法:<T>,T可以是任意字母,但通常必须要大写,<T>通常需放在方法的返回值声明之前。例如:public static<T> void doxx(T t);

 package cn.itcast.generic;

 import java.util.Arrays;

 public class Demo2 {

     public static void main(String[] args) {
// TODO Auto-generated method stub
Integer arr[] = {1,2,3,4,5};
swap(arr,1,2);
System.out.println(Arrays.asList(arr)); reverse(arr);
System.out.println(Arrays.asList(arr)); } //编写一个泛型方法,交换数组上的任意两个位置的元素
public static <T> void swap(T arr[],int pos1,int pos2){
T temp = arr[pos1];
arr[pos1] = arr[pos2];
arr[pos2] = temp;
} //编写一个泛型方法,接收一个任意数组,并颠倒数组中的所有元素
public static <T> void reverse(T arr[]){
int start = 0;
int end = arr.length-1;
while(true){
if(start>=end){
break;
}
T temp = arr[start];
arr[start] = arr[end];
arr[end] = temp; start++;
end--;
}
} }
 package cn.itcast.generic;

 import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set; import org.junit.Test; public class Demo1 { public static void main(String[] args) {
// TODO Auto-generated method stub }
public static void test1(){
List<Integer> list = new ArrayList<Integer>();
list.add(1); int i = list.get(0);
} @Test
public void test2(){
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("aa", 1);
map.put("bb", 2); Set<Map.Entry<String,Integer>> set = map.entrySet();
for(Map.Entry<String,Integer> me:set){
System.out.println(me.getKey() + "=" + me.getValue());
}
} }

注意:

只有对象类型才能作为泛型方法的实际参数。

在泛型中可以同时有多个类型,例如:

public static <K,V> V getValue(K key){return map.get(key);}

泛型类

如果一个类多处都要用到同一个泛型,这时可以把泛型定义在类上(即类级别的泛型),语法格式如下

public class GenericDao<T>{

  private field1;

  public void save(T obj){}

  public T getId(int id){}

}

注意,静态方法不能使用类定义的泛型,而应单独定义泛型。

泛型的典型应用:BaseDao和反射泛型

泛型仅仅是java的语法糖,它不会影响java虚拟机生成的汇编代码,在编译阶段,虚拟机就会把泛型的类型擦除,还原成没有泛型的代码,顶多编译速度稍微慢一些,执行速度是完全没有什么区别的.

JavaWeb_泛型(Generic)的更多相关文章

  1. Java - 泛型 ( Generic )

    Java - 泛型 ( Generic )     > 泛型的特点         > 解决元素存储的安全性问题         > 解决获取数据元素时,需要类型强转的问题     ...

  2. Java之集合初探(二)Iterator(迭代器),collections,打包/解包(装箱拆箱),泛型(Generic),comparable接口

    Iterator(迭代器) 所有实现了Collection接口的容器都有一个iterator方法, 用来返回一个实现了Iterator接口的对象 Iterator对象称作迭代器, 用来方便的实现对容器 ...

  3. 谈一谈从 Delphi 2009 之后就支援的重要功能 – 泛型 (Generic)

    前言 在C++的语言基础当中,除了物件导向.事件驱动的概念之外,模版设计(Template)也是非常重要的一环.然而,C++的开发人员能够善用模版设计的并不多.模版设计这个好物,一般还有一个名称,就是 ...

  4. JAVA中的泛型(Generic)

    Java泛型(Generic)简介 泛型是jdk1.5版本以后推出来的,表示类型参数化,让java能更具有动态性一些,让类型能变成参数传递. 要我自己感觉的话,泛型本身没啥用,跟反射在一起用,就体现出 ...

  5. Dephi泛型generic的应用

    Dephi泛型generic的应用   泛型在C++, C#中已有广泛应用,Delphi自2009版本也引入泛型,典型的应用如TList,TDictionary.如果你熟悉C#,其用法十分类似. 比如 ...

  6. Java基础之Comparable接口, Collections类,Iterator接口,泛型(Generic)

    一.Comparable接口, Collections类 List的常用算法: sort(List); 排序,如果需要对自定义的类进行排序, 那就必须要让其实现Comparable接口, 实现比较两个 ...

  7. Java自学-集合框架 泛型Generic

    ArrayList上使用泛型 步骤 1 : 泛型 Generic 不指定泛型的容器,可以存放任何类型的元素 指定了泛型的容器,只能存放指定类型的元素以及其子类 package property; pu ...

  8. C#泛型(Generic)

    一.什么是泛型 泛型(Generic)是C#语言2.0.通用语言运行时(CLR)2.0..NET Framework2.0推出来的新特性. 泛型为.NET框架引入类型参数(Type Parameter ...

  9. .NET知识梳理——1.泛型Generic

    1. 泛型Generic 1.1        引入泛型:延迟声明 泛型方法声明时,并未写死类型,在调用的时候再指定类型. 延迟声明:推迟一切可以推迟的. 1.2        如何声明和使用泛型 泛 ...

随机推荐

  1. CodeForces - 891C: Envy(可撤销的并查集&最小生成树)

    For a connected undirected weighted graph G, MST (minimum spanning tree) is a subgraph of G that con ...

  2. PLSQL Developer 攻略

    .Net程序员学用Oracle系列(18):PLSQL Developer 攻略   1.功能说明及使用技巧 1.1.对象浏览器 1.2.SQL 窗口 1.3.测试窗口 1.4.命令窗口 1.5.图表 ...

  3. Maven:Resource Path Location Type Project configuration is not up-to-date with pom.xml. Run project configuration update

    Maven构建项目的时候提示: Description Resource Path Location Type Project configuration is not up-to-date with ...

  4. 终于解决了一个Win7 下 VS 编译的问题,困扰了我好几个月

    用 Win7 一年多了,一直在这个环境下编程,其他都挺好,就是有个问题非常恶心,在VS下编译经常出现进程正在使用,无法覆盖的错误,这个问题我记得博问中以前也有其他人遇到过,也没有解决掉.此问题困扰了我 ...

  5. [转]angular之$apply()方法

    这几天,根据buddy指定的任务,要分享一点angular JS的东西.对于一个在前端属于纯新手的我来说,Javascript都还是一知半解,要想直接上手angular JS,遇到的阻力还真是不少.不 ...

  6. [转载]将网卡(设备中断)绑定到特定CPU

    在前阵子看到HelloDB的一篇文章“MySQL单机多实例方案”中提到: 因为单机运行多个实例,必须对网络进行优化,我们通过多个的IP的方式,将多个MySQL实例绑定在不同的网卡上,从而提高整体的网络 ...

  7. Day2-Python基础2---字符串操作

    一.字符串操作 特性:不可修改 name = "my \tname is {name} and i am {year} old" #首字母大写.capitalize print(n ...

  8. Mybatis多参数查询映射

    一.单个参数: public List<XXBean> getXXBeanList(String xxCode); <select id="getXXXBeanList&q ...

  9. windows黑科技-记录dns log

    昨天看到袁哥微博,看到了这篇,今天测试了一下,记录下来: The DNS Client service does not log by default. However, if a file name ...

  10. Python函数(四)-递归函数

    递归函数就是函数在自己内部调用自己 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" def Digui(n): print(n ...