------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
泛型概述:
泛型是JDK1.5出现的新特性,用于解决安全问题,是一个类型安全机制。
好处:(1)将运行时期出现的问题ClassCastException,转移到编译时期,方便程序员解决问题,更加安全。
(2)避免了强制转换的麻烦。
泛型使用:
泛型格式:通过<>定义要操作的引用数据类型。
经常在集合中会用到泛型来限定所要传入的类型。
泛型类:
什么时候定义泛型类呢?
当类中要操作的引用数据类型不确定时,就能定义泛型。
代码类示例:
package genericity;
public class Test1 {
public static void main(String[] args){
Utils<Worker> utils=new Utils<Worker>();
utils.setObject(new Worker());
//这就是它的好处,不用强制类型转换了。
Worker worker=utils.getObject();
}
}
class Worker{}
class Student{}
class Utils<QQ>{
private QQ q;
public QQ getObject() {
return q;
}
public void setObject(QQ q) {
this.q = q;
}
}
泛型方法:
泛型类定义泛型,在整个类都有效,如果被方法使用,那么泛型类的对象明确后要操作的具体类型后,所有要操作的类型就已经固定了。为了让不同方法操作不同类型,而且类型不确定,那么可以定义在方法中。
class Demo
{
public <T> void get(){
}
public <T> Object set(T t){
return null;
}
}
静态方法泛型:
静态方法不可以访问类上定义的泛型。因为泛型只有到实例化对象时才被确定。
如果静态方法操作的引用类型不确定,可以将泛型定义在方法上。
返回值类型前,修饰符后
public static <T> void method(T t);
泛型接口:
练习:
package genericity;
public interface Person<T> {
<T> void life();
<T> T friend(T t);
}
package genericity;
class Student implements Person<Student> {
private String name;
public Student(String name){
this.name=name;
}
public <Student> void life() {
System.out.println("学习");
}
public <Student> Student friend(Student s) {
System.out.println(this.name+"的学习伙伴是"+s.toString());
return s;
}
public String toString(){
return this.name;
}
}
class Worker implements Person<Worker>{
private String name;
public Worker(String name){
this.name=name;
}
@Override
public <Worker> void life() {
System.out.println("工作");
}
@Override
public <Worker> Worker friend(Worker w) {
System.out.println(this.name+"的工作伙伴是"+w.toString());
return w;
}
@Override
public String toString() {
return this.name;
}
}
package genericity;
public class Demo {
public static void main(String[] args){
Person<Student> p=new Student("lili");
Person<Student> p2=new Student("java");
Person<Worker> p3=new Worker("wangwu");
Person<Worker> p4=new Worker("jiqi");
p.life();
p.friend(p2);
p3.life();
p3.friend(p4);
}
}
泛型限定:
当类型不确定时,可以用通配符。
ArrayList<T> 或者 ArrayList<?>
T是指具体类型,传什么就是什么
?不明确类型,占位符。
泛型的好处:具有扩展性。
不好处:不能使用类型特有方法。
上限:<? extends E>:接收E类型或者是E类型的子类
下限:<? super E>:接收E类型或者是E类型的父类。