/*
class Tool
{
private Worker w;
public void setWorker(Worker w)
{
this.w = w;
}
public Worker getWorker()
{
return w;
}
}
*/
class Worker{}
class Student{}
class Tool //早期定义Object来完成扩展。这么做虽然可以接受所有数据,让编译通过
//但是在运行期就不一定通过,而出现的异常通常用户是不容易解决的
{
private Object obj;
public void setObject(Object obj)
{
this.obj = obj;
}
public Object getObject()
{
return obj;
}
}
/*
现在定义泛型来完成扩展。
*/
class Utils<QQ>
{
private QQ q;
public void setObject(QQ q)
{
this.q = q;
}
public QQ getObject()
{
return q;
}
}
class GenericDemo3
{
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();//必须将调用的Student强制转化为Worker
*/
}
}
/*
一般来说,当类中要操作的引用数据类型不确定时,这时候就要用泛型类了。
但是,泛型类定义的泛型在整个类中都有效,如果被类中的方法使用,那么泛型类的
对象明确要操作的具体类后,所有要操作的类型就已经固定了,这样就有些局限性了。
所以为了不同方法可以操作不同的类型,而且类型也不确定,那么最好把泛型定义在方法上。
记住另一点:静态方法不可以访问类上定义的泛型,可以定义在方法上。
优点: 可以解决安全性问题
泛型的出现可以将运行时出现的问题classCaseException异常,转移到编译时期,可以让设计者更好的为用户解决潜在问题,
避免了强制转化格式;
通过<>来定义要操作数据类型,<>用来接收类型,将集合中要存储的数据类型作为参数
传递到<>中即可。
*/ |