---------- android培训、java培训、期待与您交流! ----------
泛型也是jdk1.5的新特性,它是模仿C++的泛型产生的,它的出现实现了一份代码可以被多种不同类型的对象重用,并且是代码简单,安全.
泛型只在编译时期有效,通过泛型,编译器可以过滤一些不符合泛型的类型,而jvm在执行程序的时候,会去掉泛型,
泛型好处
泛型的主要好处就是让编译器保留参数的类型信息,执行类型检查,执行类型转换操作,编译器保证了这些类型转换的绝对无误。
/******* 不使用泛型类型 *******/
List list1 = new ArrayList();
list1.add(0); /编译器不检查值
String str1 = (String)list1.get(0); //需手动强制转换,如转换类型与原数据类型不一致将抛出ClassCastException异常
/******* 使用泛型类型 *******/
List<String> list2 = new ArrayList<String>();
list2.add("value");//[类型安全的写入数据] 编译器检查该值,该值必须是String类型才能通过编译
String str2 = list2.get(0); //[类型安全的读取数据] 不需要手动转换
泛型中的? 通配符(可以是任意类型)
1. 使用?通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,可以调用
与参数化无关的方法,不能调用与参数化有关的方法
2.限定通配符的上边界 extends
限定通配符的下边界 extends
限定通配符总是包含自己 (包含自己和自己的子类)
注意:在对泛型类型进行参数化时,类型参数的实例必须是引用类型,不能是基本类型。
当一个变量被声明为泛型时,只能被实例变量和方法调用(还有内嵌类型),而不能被静态变量和静态方法调用。应为静态成员是被所有参数化的类所共享的,所以静态成员不应该有类级别的类型参数。
泛型类
什么时候定义泛型类?
当类中要操作的引用数据类型不确定的时候
早期定义Object来完成扩展
现在定义泛型来完成扩展
代码实现入下:
class Utils<QQ>
{
private QQ q;
public void setObject(QQ q)
{
this.q = q;
}
public QQ getObject()
{
return q;
}
}
class GenericDemo2
{
public static void main(String[] args)
{
Utils<Worker> u = new Utils<Worker>();
u.setObject(new Student());
Worker w = u.getObject();
/*
Tool t = new Tool();
t.setObject(new Student());
Worker w = (Worker)t.getObject();
*/
}
}