问题:如果我们需要产生多个对象,对每个对象的逻辑完全一样,只是对象内的成员变量的类型不同。那么我们如何去做?
*创建多个类文件,给每个类钟的成员变量设置制定的数据类型
缺点:这种方式导致类的膨胀,重用性太差
*创建一个类文件,给这个类钟的成员变量设置Object数据类型
缺点:编译的时候正常,但运行的时候可能会异常
泛型简介
*泛型可以在编译的时候检查
类型安全,并且所有的
强制转换都是自动和隐式的。
*原理就是“
类型的参数化”,即把类型看作参数。也就是说把所有操作的数据类型看做参数,就行方法的形式参数是运行时传递的值得占位符一样。
*简单说,
类型变量扮演的角色就如同一个参数,他提供给编译器用来类型检查的信息。
*泛型可以提高代码的拓展性和重用性
总结:所谓泛型,即通过类型参数化来实现在同一份代码上操作多种类型数据,泛型编程是一种编程范式,他利用“参数化类型”将类型抽象化,从而实现更灵活的复用
示例——泛型类
public class GenClass
<T>{
private T obj;
public GenClass (T obj) {
this.obj = obj;
}
public T getObj() {
return obj;
}
public void setObj(T obj) {
this.obj = obj;
}
}
public class GenericDemo {
public static void main(String[] args) {
//创建一个泛型类对象
GenClass<String> gen1 = new GenClass<String>("hahaha");
System.out.println(gen1.getData());
GenClass<Integer> gen2 = new GenClass<Integer>(100);
System.out.println(gen2.getClass());
}
}
//创建一个泛型类
class GenClass<T>{
private T data;
public GenClass(T data) {
this.data = data;
}
public void setData(T data) {
this.data = data;
}
public T getData() {
return data;
}
}
public static void main(String[] args) {
//创建一个泛型类对象
GenClass<String> gen1 = new GenClass<String>("hahaha");
System.out.println(gen1.getData());
GenClass<Integer> gen2 = new GenClass<Integer>(100);
System.out.println(gen2.getClass());
}
}
//创建一个泛型类
class GenClass<T>{
private T data;
public GenClass(T data) {
this.data = data;
}
public void setData(T data) {
this.data = data;
}
public T getData() {
return data;
}
}
1、泛型的类型参数可以是泛型类
2、泛型类可以同时设置多个类型参数
3、泛型类可以继承泛型类
4、泛型类可以实现泛型接口
限制泛型可用类型
在定义泛型类别时,默认在实例泛型类的时候可以使用任何类型,但是如果想要限制泛型类型时,只能用某个特定类型或者其子类型才能实例化该类型时,可以在定义类型时,使用
extends关键字指定这个类型必须是
继承某个类,或者
实现某个接口。
A<T>
A<T ectends B>
当没有指定类型的类型或接口时,默认使用
extends Object,所以默认情况下任何类型都可以做为参数传入
package generic;
public class GenericDemo3 {
public static void main(String[] args) {
GenericClass<Dog> dogClass = new GenericClass<Dog>();
dogClass.setObj(new Dog());
dogClass.getObj().eat();
GenericClass<Cat> catClass = new GenericClass<Cat>();
catClass.setObj(new Cat());
catClass.getObj().eat();
}
}
class GenericClass<T extends Animal>{
private T obj;
public void setObj(T obj) {
this.obj = obj;
}
public T getObj() {
return obj;
}
}
abstract class Animal{
public abstract void eat();
}
class Dog extends Animal{
public void eat() {
System.out.println("骨头");
}
}
class Cat extends Animal{
public void eat() {
System.out.println("鱼");
}
}
public class GenericDemo3 {
public static void main(String[] args) {
GenericClass<Dog> dogClass = new GenericClass<Dog>();
dogClass.setObj(new Dog());
dogClass.getObj().eat();
GenericClass<Cat> catClass = new GenericClass<Cat>();
catClass.setObj(new Cat());
catClass.getObj().eat();
}
}
class GenericClass<T extends Animal>{
private T obj;
public void setObj(T obj) {
this.obj = obj;
}
public T getObj() {
return obj;
}
}
abstract class Animal{
public abstract void eat();
}
class Dog extends Animal{
public void eat() {
System.out.println("骨头");
}
}
class Cat extends Animal{
public void eat() {
System.out.println("鱼");
}
}