10
1
2011
0

java 泛型 略谈 ……


泛型一般是在集合中用得最多,如下代码

List<String> list = new ArrayList<String>();
list.add("123");
String str = list.get(0);


如此一来,list.get(0)的时候就不需要这样:(String)list.get(0)了。

总的来说,泛型的作用就是告诉编译器,对某类型进行限制,如果不符合,则编译器会报错的!!

一般而言,有以下几种不同的用法:
1、普通又常见的用法,即限制某一对象中元素的类型:

  List<String> list = new ArrayList<String>();
  list.put("one");
  String one = list.get(0);

  1.1 加强写法:即对List中的元素的类型进行大范围的限制,即Generic或其子类,ps:只能加在变量的声明上,如声明变量时或者声明方法的参数传递的时候等等。另外在new的时候似乎只能给于具体的类型限制,可以是父类or子类的类型,但取出元素的时候,其类型是父类类型的!!!!!

List<? extends Generic> list = new ArrayList<Generic>();
// PS:注意?的使用,这边只能使用问号,不同于2中的使用!

ArrayList<? extends Generic> list2 = new ArrayList<Generic>();

List<? extends Generic> list3 = new ArrayList<Gene>(); 
//new的时候的限制可以是父类or子类的类型

Generic g = list.get(1);  
//但取出元素的时候,其类型是父类类型的!!!!!

  1.2 嵌套的约束,如代码所示,不多解释,反正是<>中所放的类型中还需or可进行约束…… 在对map进行Entry迭代的时候会碰到,别的地方很少见,除非自己写类的时候写到了这种境地……

Map<String,Integer> map = new HashMap<String, Integer>();
for (Iterator<Entry<String, Integer>> i = map.entrySet().iterator();
     i.hasNext();) {
   Entry<String,Integer> e = i.next();
   System.out.println(e);           
}


2、在方法上使用泛型来约束所传入的参数&所返回的参数类型,PS:注意返回类型的写法<T> T ,还有就是返回类型限制的前提是传入参数类型限制的T的存在。

public <T> T fun(T t){
// 可以接收任意类型的数据
//PS:数组的写法,就加<T>T[]  & T[] t(c写法T t[])就行了
//另外的一种高级的写法是T...t  可接收可变参数 
//,即可接收一个数组或多个单一的元素,但不能混传~

  return t ;                  
// 直接把参数返回     
}

  2.1 类/接口上进行泛型约束,以约束类中的相关的类型,那些集合(list,map)都是这么写的!!)

   class Demo<T>{
      private T t;
      public T getT(){return t;}  
//通过对类进行约束后
//其方法的约束的返回类型就不需要像上面那样写了

      public void setT(T t){this.t=t;}
   }



略略而言就上面这点!

命名类型参数
推荐的命名约定是使用大写的单个字母名称作为类型参数。对于常见的泛型模式,推荐的名称是:
* K —— 键Key,比如映射的键。
* V —— 值Value,比如 List 和 Set 的内容,或者 Map 中的值。
* E —— 异常类 或 集合中的一元素的类型。
* T —— 泛型 或者 说是Type,不知道取什么的时候可以用这个………………
PS:?的使用,在声明变量的时候,用<?>表示可以接收任意的类型,即不作限制,似乎等同于,不写<?>…… 用处见1.1例子!


参考文章:
  http://lichaozhangobj.iteye.com/blog/476911
  http://blog.csdn.net/zkdemon/article/details/2043503

Category: JAVA基础 | Tags: Java | Read Count: 1606

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com