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. HNOI2004 宠物收养所 (平衡二叉树)

    题目链接 平衡树基础题,用于测试各种平衡树的性能(雾) treap: #include<bits/stdc++.h> typedef long long ll; using namespa ...

  2. 教你用 Python 实现抖音热门表白软件

    之前在群里看到有人发了一个抖音上很火的小视频,就是一个不正经的软件,运行后问你是不是愿意做我的朋友,但你没法点击到「不同意」!并且没办法直接关闭窗口! 很不正经,很流氓,有点适合我. 效果大概是这样的 ...

  3. Yii的常用URL和渲染方法

    当前页面url  Yii::app()->request->url;跳转前一个页面url $this->redirect(Yii::app()->request->url ...

  4. Js里头的对象字面量

    JavaScript 对象字面量 在编程语言中,字面量是一种表示值的记法.例如,"Hello, World!" 在许多语言中都表示一个字符串字面量(string literal ) ...

  5. 2、配置Selenium RC

    1.相关Jar包:链接: https://pan.baidu.com/s/1YLp-_5t7heyzPg550BWTGg 密码: w7ne 2.启动Selenium的方法 (1)cmd命令进入sele ...

  6. java服务覆盖率统计 jacoco ant

    ● 下载jacoco.exec.jacocoant.jar.jacocoagent.jar ● jvm启动参数中添加(tomcat服务原理一样) JACOCO_OPTS=JAVA_OPTS=" ...

  7. Oracle 常用语句SQL

    查询Oracle 用户下面的所有表,表注释,行数 select t.TABLE_NAME, s.comments,t.NUM_ROWS  from user_tables t, user_tab_co ...

  8. 基于TCP协议 I/O多路转接(select) 的高性能回显服务器客户端模型

    服务端代码: myselect.c #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> ...

  9. PCIe相关的操作命令

    1.lspci        --显示列举系统目前的pcie设备    43:00.0 Class 0004: Device 104c:b800 (rev 01)    //netra设备 设备编号 ...

  10. 【转】bootstrap模态框(modal)使用remote方法加载数据,只能加载一次的解决办法

    http://blog.csdn.net/coolcaosj/article/details/38369787 bootstrap的modal中,有一个remote选项,可以动态加载页面到modal- ...