java泛型

一、泛型是个什么鬼

     泛型,顾名思义就是“广泛的类型”。在代码中它代表某一类 类型,而它具体代表哪一个类型只有在代码运行的过程中才能确定。先让我们看看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>    可以同时指定继承一个类,多个接口

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值