(71)泛型定义在类、方法、接口
什么时候定义泛型类?
当类中要操作的引用数据类型不确定时:
早期定义Object来完成拓展,现在定义泛型来完成拓展。
一、下面简单演示不确定要操作学生还是工人时,封装成泛型类
public class Student {
}
public class Worker {
}
public class Tool<T> {
private T t;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
public class ToolDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Tool<Worker> t=new Tool<Worker>();
t.setT(new Worker());
t.setT(new Student());//编译不能通过
Worker w=t.getT();//省去了类型转换
}
}
泛型类定义的泛型,在整个类中有效,如果被方法使用,那么泛型类的对象明确操作的具体类型后,所有要操作的类型已经固定了,只能一种数据类型
二、泛型方法为了让不同方法可以操作不同类型,可以将泛型定义在方法上。
在定义泛型方法时,应该将<>写在返回值的前面、修饰符的后面。(语法规则)
public class Student {
public <T> void show(T t) {
System.out.println("show:"+t);
}
public <T> void print(T t) {
System.out.println("print:"+t);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Student stu=new Student();
//在非泛型类中定义泛型方法,可以不同方法操作不同数据类型
stu.print("hahah");
stu.show(new Integer(4));
}
三、也可以在泛型类中定义非泛型类操作引用类型的泛型方法
泛型类的引用类型为T,在show方法中有效,在print方法中无效
public class Student<T> {
public void show(T t) {
System.out.println("show:"+t);
}
public <Q> void print( Q q) {
System.out.println("print:"+q);
}
}
public class ToolDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student<String> stu=new Student<String>();
stu.show("hahah");
//可以用不同的引用数据类型
stu.print(new Integer(4));
stu.print("heihei");
}
}
四、特殊之处:静态方法不可以访问类上定义的泛型(静态方法在类加载时就存在,但是此时还没有对象,确定引用数据类型是在创建对象时确定的)。
如果静态方法操作的引用数据类型不确定,可以将泛型定义在方法上
五、也可以定义泛型接口,在实现它的类上要具体明确是哪种引用类型
public interface Inter <T>{
public abstract void show(T t);
}
public class Student implements Inter<String> {
public void show(String str) {
System.out.println("show:"+str);
}
public static <Q> void print( Q q) {
System.out.println("print:"+q);
}
}
public class ToolDemo {
public static void main(String[] args) {
Student.print(45);//四
Student stu=new Student();
stu.show("hahaha");//五
}
}