一、泛型是个什么鬼
泛型,顾名思义就是“广泛的类型”。在代码中它代表某一类 类型,而它具体代表哪一个类型只有在代码运行的过程中才能确定。先让我们看看JDK中的泛型:
JDK集合接口中的泛型
在开发中,我们经常会用到集合,集合中可以存储除基本数据类型之外的任何类型对象。那具体要存储哪一类对象呢?这就需要在创建集合的时候进行指定(默认是Object),这种机制就是泛型。泛型的主要目标是实现java的类型安全,使编译器知道一个对象的限定类型是什么,尽可能的避免强制类型转换,使得代码可读性好。
二、举个栗子
废话不说,直接上代码!
package com.java.test;
//人类
public abstract class Person {
protected String name; //每个人都得有名字吧
protected String from; //是人都得有个出处吧
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setFrom(String from) {
this.from = from;
}
// 个人信息接口
public abstract String getInfo(); //是人都有向外提供信息的接口,但每个人的信息都不同
}
package com.java.test;
//学生是人类的一种
public class Student extends Person {
private String school;
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
@Override
public String getInfo() {
return "我叫" + name + ",出生自" + this.from + ",我是个学生,就读于" + school;
}
}
package com.java.test;
//程序员是人类的一种
public class Programmer extends Person {
private String language;
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
@Override
public String getInfo() {
return "哈哈哈,大家好我是" + name + ",我来自" + this.from + ",我是一名程序员, 从事" + language + "开发";
}
}
package com.java.test;
//这是个供人类展示个人信息的舞台,所以类型必须是Person或Person的继承类
public class PersonDisplay<E extends Person> {
public void show(E person) {
System.out.println(person.getInfo());
}
}
package com.java.test;
//造人的工厂
public class MakePersonFactory {
private String factoryName;
public MakePersonFactory(String factoryName) {
this.factoryName = factoryName;
}
/**
* 这个方法只能造人,所以类型必须是Person或Person的继承类
* @param type 你想要造哪一类人
* @param name 人的名字
*/
public <T extends Person> T makePerson(Class<T> type, String name) {
T person = null;
try {
person = type.newInstance();// 开始造人了
} catch (Exception e) {
System.out.println("呀,造人失败!");
}
person.setName(name);// 赋予它名字
person.setFrom(factoryName);// 赋予它出处
return person;
}
}
package com.java.test;
//跑一下
public class Main {
public static void main(String[] args) {
MakePersonFactory factory = new MakePersonFactory("1号工厂"); // 新建一个造人的工厂
Student s1 = factory.makePerson(Student.class, "乔布茨"); // 造一个学生
s1.setSchool("斯坦福大学");
Student s2 = factory.makePerson(Student.class, "比尔盖斯"); // 再造一个学生
s2.setSchool("哈佛大学");
Programmer p1 = factory.makePerson(Programmer.class, "马云云"); // 再造一个程序员
p1.setLanguage("Java");
PersonDisplay<Person> display = new PersonDisplay<>(); // 新建一个舞台
display.show(s1); // 展示下每个人的信息
display.show(s2);
display.show(p1);
}
}
运行结果:
三、泛型的几种声明&使用方法
泛型的名字可以随便起,比如E、T等,甚至可以是?号,名字只是个代号。泛型在声明类或方法的地方进行定义
<? extends T> ?必须是T的子类
<? super T> ?是T的父类,可以是Object
<T1 extends Person, T2 extends Person> 可以同时定义多个泛型
<T extends Person & Serializable> 可以同时指定继承一个类,多个接口