--------------- android培训、java培训、期待与您交流!---------------
泛型:
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率
1、下面的一个例子可以看到,通过反射和泛型将字符串加入到Integer类型的集合当中去了。
import java.util.*;
public class GenericTest {
/**
* @param args
*/
publicstatic void main(String[] args) throws Exception{
ArrayList<String>collection2 = new ArrayList<String>();
ArrayList<Integer>collection = new ArrayList<Integer>();
//泛型给编译器使用。而字节码是在内存当中,所以他们相等说明到JVM运//行的时候就已经不关他们(String,Integer)的事情了。
System.out.println(collection.getClass()==collection2.getClass());//这个打印的是true
Stringstr = "bac";
collection.getClass().getMethod("add",Object.class).invoke(collection, str);
System.out.println(collection.get(0));
System.out.println(collection.size());
}
}
总结一下:就是说泛型提供给编译器使用。参数化的泛型类型,getClass()返回的值和原始类型的值是一样的。编译生成的字节码在内存中,当JVM运行时候会去掉泛型的类型信息。所以在运行期间就可以改变类型参数,对于集合,就可以加入不同的类型的值了。通过反射就可以做到,例如:collection.getClass().getMethod("add",Integer.class).invoke(collection, str);
一:泛型的一些术语:以ArrayList举例
1、ArrayList<E>:泛型类型
2、E称为类型变量或类型参数
3、整个ArrayList<Integer>称为参数化的类型
4、Integer 称为类型参数的实例或这实际类型参数
5、ArrayList 叫原始类型
二:泛型的一些规则和限制(不全的。)
1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型(如:int)
2、泛型不考虑继承(参数化类型不考虑类型参数的继承关系)
3、使用通配符可以引用其他各种参数化的类型,通配符定义的变量主要是用作引用;使用通配符的时候,可以调用与参数化无关的方法,不能调用与参数化有关的方法。
例如:有个方法:public void print(Collection<?> c){ c.add("bac");}//这样调用就不可以,因为有可能传来的参数是Integer 你不能确定是String
4、E 为任意类型,不能用类型化的参数创建数组:ArrayList<Integer>[] x =new ArrayList<Integer>();这样是不行的。
5、当使用类级别的泛型类型的时候,类里面的静态方法不能用泛型的类型。如果要用必须指定和类级别不同的泛型,例如: public satic <T> void setX(T t){ }
--------------- android培训、java培训、期待与您交流!---------------