Jdk5.0新特性Generic Types(泛型)

1. 介绍

2.定义简单Java泛型

其实Java的泛型就是创建一个用类型作为参数的类。就象我们写类的方法一样,方法是这样的method(String str1,String str2 ),方法中参数str1、str2的值是可变的。而泛型也是一样的,这样写class Java_Generics<K,V>,这里边的K和V就象方法中的参数str1和str2,也是可变。下面看看例子:

import java.util.Hashtable;
class TestGen0<K,V>{
  public Hashtable<K,V> h=new Hashtable<K,V>();
  public void put(K k, V v) {
   h.put(k,v);
  }
  public V get(K k) {
   return h.get(k);
  }
  public static void main(String args[]){
   TestGen0<String,String> t=new TestGen0<String,String>();
   t.put("key", "value");
   String s=t.get("key");
   System.out.println(s);
  }
}

正确输出:value

这只是个例子,不过看看是不是创建一个用类型作为参数的类,参数是K,V,传入的“值”是String类型。这个类他没有特定的待处理型别,以前我们定义好了一个类,在输入参数有所固定,是什么型别的有要求,但是现在编写程序,完全可以不制定参数的类型,具体用的时候来确定,增加了程序的通用性,像是一个模板。

3. 泛型通配符
首先,下面是一个例子,作用是打印出一个集合中的所有元素,我们首先用老版本jdk1.4的编码规则,代码如下:

void printColleciton(Collection c){

iterator i = c.iterator();

for (k = 0; k < c.size();k++){

System.out.pritnln(i.next();

}

然后,我们用jdk5.0泛型来重写上面这段代码(循环的语法是新版本的语法):

void printCollection(Colleciton<Object> c){

for(Object e : c){

System.out.print(e);

}

}

这个新版本并不比老版本的好多少,老版本可以用任意一种集合类型作为参数来调用,而新版本仅仅持有Collection<Object>类型,Colleciton<Object>并不是任意类型的Collection的超类。

那么什么是所有Colleciton类型的超类型呢?它是Collection<?>这样一个类型,读作“未知Colleciton”。它的意思是说Colleciton的元素类型可以匹配任意类型,我们把它称作通配符类型,我们这样写:

void printCollection(Colleciton<?> c){

for (Object e: c){

System.out.println(e);

}

}

现在我们用任意类型的集合来调用它了,需要注意的是内部方法printColleciton(),我们任可以从c中来读出元素,并且这些元素是Object类型,而且是安全的,因为无论集合中是什么类型,它总包括Object,但是将任意对象加到集合中是不安全的:

Colleciton<?> c = new ArrayList<String>();

c.add(new Object());//编译时错误

由于我们不知道c持有的是什么类型的元素,我们不能加object到集合中去。add()方法用类型E作为参数,(集合的元素类型)当真正的参数类型是?的时候,它代表的是一些未知类型。任何传递给add()方法的参数必须是这个未知类型的子类型。由于我们不知道未知类型,所以我们传递给它任何东西。主要的例外是null,它是每一个类型的成员。

另一方面,假定给一个List<?>,我们调用get()并且充分利用结果。结果类型是未知类型。但是我总是知道它是一个Object,因此分配一个从get()取出来的结果到一个object的变量是安全的,或者作为一个参数传递到一个需要object类型的地方。

时间: 2024-09-08 08:02:49

Jdk5.0新特性Generic Types(泛型)的相关文章

JDK5.0新特性系列---目录

  JDK5.0新特性系列---目录   JDK5.0新特性系列---1.自动装箱和拆箱   JDK5.0新特性系列---2.新的for循环 JDK5.0新特性系列---3.枚举类型 JDK5.0新特性系列---4.静态导入 JDK5.0新特性系列---5.可变长参数Varargs JDK5.0新特性系列---6.格式化输出 JDK5.0新特性系列---7.使用ProcessBuilder执行本地命令 JDK5.0新特性系列---8.泛型编程 JDK5.0新特性系列---9.注释功能Annota

JDK5.0新特性系列---11.6线程 BlockingQueue

  importjava.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;   /**     本例介绍一个特殊的队列:BlockingQueue,如果BlockQueue是空的,从BlockingQueue取东西的操作将会

JDK5.0新特性--可变参数

/** * 可变参数 */ public class VariableParamater { /** * 统计2个或多个数的和 */ public static void main(String[] args) { //计算2个数的和 sum(10,15); /* * 问题:如果要计算3个数.4个数.5个数或n个数的和,那我们不是要写n个相同的方法,传递n个参数进行累加? * 注:在同一个类中有多个方法的名字相同,且参数列表不同(参数个数.参数类型),称之为方法重载(method overloa

JDK5.0新特性系列---11.3线程 锁Lock

  import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.Reent

JDK5.0新特性系列---11.1线程 Callable和Future

  import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future;   /**     从本节开始,主要介绍J2SE5.0与线程相关的新特性,新的线程类主要集中在java.util.concurrent 包中,本节实例将介绍如何使用java.uti

JDK5.0新特性系列---11.2线程 任务执行架构

  import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecu

JDK5.0新特性系列---8.泛型编程

  import java.util.ArrayList; import java.util.Collection; import java.util.List;   /**  *泛型编程关键掌握两点:  *1.在方法参数中使用通配符  *2.在方法的参数类型和返回类型中使用通用类型  */ /**关键技术  *1.通配符问号(?)表示任意类型.如"List<?>"表示可以存放任意对象类型的List  *2.通配符可以接extends和super,表示有限制的通配符.如&q

JDK5.0新特性系列---11.5.1线程 同步装置之Semaphore

    import java.util.ArrayList; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;   /**

JDK5.0新特性系列---2.新的for循环

  import java.util.ArrayList; import java.util.List;   /**  * 新的for循环,格式为for(type x:type y)  * 表示遍历数组或集合y的元素,把元素值赋给x  */ public class ForEach {        /**对整数数组求和*/        public static long getSum(int[] nums) throws Exception{               if(nums =