泛型与数据类型转换

          jdk6都出来有一点时间,感觉自己还是停留在jdk4的水平上,今天研究线程的时候,看到资料上的
         ExecutorService pool = Executors.newCachedThreadPool();以及class MatchCounter implements Callable ,感觉很是奇怪.后来上网找了资料才知道是 Jdk5.0新特性——Generic Types (泛型).
        我就将我理解的大体说一下,大家学习一下.
import  Java.util.Hashtable; 
class  Test 
  
public static void main(String[] args) 
   Hashtable h 
= new Hashtable(); 
   h.put(
"key""value"); 
   String s 
= (String)h.get("key"); 
   System.out.println(s); 
  }
 
}
 
      这个我们做了类型转换,是不是感觉很烦的,并且强制类型转换会带来潜在的危险,系统可能会抛一个 ClassCastException 异常信息。在 JDK5.0 中我们完全可以这么做,如:
import  java.util.Hashtable;

public   class  Test  {
    
public static void main(String[] args) {
        Hashtable
<String, Integer> h = new Hashtable<String, Integer>();
        h.put(
"key"new Integer(123));
        
int s = h.get("key");
        System.out.println(s);
    }

}

      这里我们使用泛化版本的 HashMap, 这样就不用我们来编写类型转换的代码了,类型转换的过程交给编译器来处理,是不是很方便,而且很安全。上面是 String 映射到 String ,也可以将 Integer 映射为 String ,只要写成 HashTable h=new HashTable();h.get(new Integer(0)) 返回 value 。果然很方便!

      从上面有没有看到有点别扭啊,h.get(new Integer(123))这里的new Integer(123);好烦的,在JDK5.0之前我们只能忍着了,现在这种问题已经解决了,请看下面这个方法。我们传入一个int这一基本型别,然后再将i的值直接添加到List中,其实List是不能储存基本型别的,List中应该存储对象,这里编译器将int包装成Integer,然后添加到List中去。接着我们用List.get(0);来检索数据,并返回对象再将对象解包装成int。恩,JDK5.0给我们带来更多方便与安全。
public   void  autoBoxingUnboxing( int  i) 
  ArrayList
<Integer> L= new ArrayList<Integer>(); 
  L.add(i); 
  
int a = L.get(0); 
  System.out.println(
"The value of i is " + a); 
}
 

      也许你已经发现在 TestGen 这个泛型类 , 其中 K,V 可以是任意的型别。也许你有时候呢想限定一下 K V 当然范围,怎么做呢?看看如下的代码:
package  jdk5;

public   class  TestGen2 < extends  String, V  extends  Number >   {
    
private V v = null;

    
private K k = null;

    
public void setV(V v) {
        
this.v = v;
    }


    
public V getV() {
        
return this.v;
    }


    
public void setK(K k) {
        
this.k = k;
    }


    
public K getK() {
        
return this.k;
    }


    
public static void main(String[] args) {
        TestGen2
<String, Integer> t2 = new TestGen2<String, Integer>();
        t2.setK(
new String("String"));
        t2.setV(
new Integer(123));
        System.out.println(t2.getK());
        System.out.println(t2.getV());
    }

}

上边K的范围是<=String V的范围是<=Number,注意是“<=”,对于K可以是String的,V当然也可以是Number,也可以是Integer,Float,Double,Byte等。
  这个是单一的限制,你也可以对型别多重限制,如下: 

         class C & Serializable>
  我们来分析以下这句,T extends Comparable这个是对上限的限制,Comparable< super T>这个是下限的限制,Serializable是第2个上限。一个指定的类型参数可以具有一个或多个上限。具有多重限制的类型参数可以用于访问它的每个限制的方法和域。

 

你可能感兴趣的:(泛型与数据类型转换)