冷面阎罗

低调做人&&高调做事
随笔 - 208, 文章 - 3, 评论 - 593, 引用 - 0
数据加载中……

泛型与数据类型转换

         jdk6都出来有一点时间,感觉自己还是停留在jdk4的水平上,今天研究线程的时候,看到资料上的
         ExecutorService pool = Executors.newCachedThreadPool();以及class MatchCounter implements Callable<Integer> ,感觉很是奇怪.后来上网找了资料才知道是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<Integer,String> h=new HashTable<Integer,String>();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可以是任意的型别。也许你有时候呢想限定一下KV当然范围,怎么做呢?看看如下的代码:
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<T extends Comparable<? super T> & Serializable>
  我们来分析以下这句,T extends Comparable这个是对上限的限制,Comparable< super T>这个是下限的限制,Serializable是第2个上限。一个指定的类型参数可以具有一个或多个上限。具有多重限制的类型参数可以用于访问它的每个限制的方法和域。

 

posted on 2006-12-26 21:49 冷面阎罗 阅读(1224) 评论(0)  编辑  收藏 所属分类: java


只有注册用户登录后才能发表评论。


网站导航: