Java之泛型篇


出处:http://blog.csdn.net/snowcoldy/article/details/6745715


1、泛型的意义:

往小处说,是为了实现类型安全的集合

往大处说,是为了实现模版编程的理念

 

2、为什么要出现泛型:

虽然集合具有长度可扩充、插入删除方便等强大的特性

但是集合内部可以存储的对象是类型不安全的

 

释义:

什么是类型不安全:

因为集合内部可以装入/取出的元素是Object类型

因此任何对象都能够往里装

这时若想要从集合中取得一个String对象时

则必须要在取出后将其强制转换成String类型

但是如果取出的对象并非String类型的对象

则强制转换就会发生错误,这就是类型不安全

 

因此采用泛型是为了实现类型安全,同时提高程序的可读性

 

3、泛型的含义:

简单地理解,泛型的含义就是,在定义集合的时候,就指定集合内部可以装入对象的类型。

这样该集合内就只能装入该种类型的对象,同时取出的对象也是该种类型的,而不再是Object。

定义的格式是:

List <String> list = new Arraylist <String> ();

这样list.add("ABC");是合法的,list.add(123);就是非法的

同时String s = list.get(0);是合法的,而不需要再次进行强制类型转换

 

/*********以下内容为扩展知识*********/


4、不同泛型的集合不能够相互赋值:

只有泛型相同的集合之间才能够相互赋值

不支持泛型为子类的集合赋值给泛型为父类的集合

例如:

public void print(List <Object> list) {

  for(Object o:list) {

    System.out.println(o);

  }

}

 

List <String> list1 = new ArrayList <String> ();

List <Object> list2 = new ArrayList <Object> ();

print(list1);  //非法

print(list2);  //合法

 

5、通配符"?"

以上问题的解决方法是:

public void print(List <?> list) {

  for(Object o:list) {

    System.out.println(o);

  }

}

 

List <String> list1 = new ArrayList <String> ();

List <Object> list2 = new ArrayList <Object> ();

print(list1)  //合法

print(list2)  //合法

 

*?是泛型的通配符,可以代表任意一个泛型

*也可以限制?可以代表泛型的泛围,语法是:

<? extends String>              //限制该泛型只能是String或String的子类

<? extends Comparable>  //限制该泛型只能是Comparable的实现类(注意这里用的也是extends)

<? super Number>              //限制该泛型只能是Number或Number的父类

 

6、定义泛型方法:

格式:在方法的返回值前面加上<T>,可以使方法称为泛型方法(模版)

作用:用于统一方法内部的参数类型,T的类型由调用该方法时的参数决定

例子:

public class TestGenerics3 {

 //定义泛型方法,定义方法的泛型为T

 //那么,该方法的参数指定T的具体类型是什么,T的类型就是什么

 public static <T> void copyFromArray(List<T> list,T[] os){
  for(T o:os){
   list.add(o);
  }
 }

 

 public static void main(String[] args) {
  List<String> l1=new ArrayList<String>();
  List<Number> l2=new ArrayList<Number>();
  List<Integer> l3=new ArrayList<Integer>();
  List<Double> l4=new ArrayList<Double>();
  List<Object> l5=new ArrayList<Object>();
  String[] o1=new String[10];
  Number[] o2=new Number[10];
  Integer[] o3=new Integer[10];
  Double[] o4=new Double[10];
  Object[] o5=new Object[10];
  copyFromArray(l1,o1); //l1的类型是String,o1的类型是String,因此T的类型也被指定为String
  copyFromArray(l2,o2); // T:Number
  copyFromArray(l3,o3); //T:Integer
  copyFromArray(l4,o4); //T:Double
  copyFromArray(l5,o5); //T:Object
 }
}

 

7、定义泛型类:

格式:在类名后面加上<T>,可以使该类称为泛型类

作用:用于动态决定类内部的方法参数类型和返回值类型

例子:

//定义一个接口,定义接口的泛型为T

//那么,该接口的实现类指定T的具体类型是什么,T的类型就是什么

interface I <T> {
 T method();  //指定该方法的返回值类型为T
}

 

//指定接口I内的T为String类型

class IC1 implements I <String>{

 public String method(){  //那么该方法的的返回值类型就是String
  return "hehe";
 }
}

 

//指定接口I内T为Collection类型

class IC2 implements I <Collection>{
 public Collection method(){ //那么该方法的返回值类型就是Collection
  return new ArrayList();
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值