/*
什么是泛型,可以这么说:
一般在类名后面加了<E>的 就是泛型的 方法名后面加了<T>的 是泛型方法
泛型两个场景的作用:
定义时:定义时泛型时用来规定数据类型的,可以理解为用一个符号代替某种类型
使用时:在使用的时候用具体的数据类型,将定义的符号替换掉
泛型可以用在类、方法、变量,还有接口上
泛型类:
类在定义的时候,描述某种数据类型,使用的时候确定数据类型
定义泛型的时候,类名后面<E>里面的这个E可以随意写。代表任意类型
创建对象的时候,就需要明确类型了。不可以在后面随意写了
举个栗子*/
public calss Animal<?>{
//这里是定义泛型,所以中托号里面可以随便写什么字母,问号也可以
}
Animal<String> animal = new Animal<String>();
//但是这里是创建对象了,也就是实例化了,所以不可以随便乱写了,需要明确数据类型
//因为Animal类后面加了泛型,所以animal在用.add方法添加数据类型的时候只能添加String类型的
/*
泛型接口:
泛型接口的使用与泛型类基本一致,但是由于接口需要实现,所以如果泛型在接口上,子类
实现接口时,也必添加泛型
举个栗子:
*/
public interface Test<E>{
//***
}//父类这里时接口,并且有泛型
public class 子类 <E> implements Test<E>{
//这里子类继承了父类,所以子类也要有泛型
}
/*
泛型方法
在方法描述的时候,可以加泛型
方法的泛型与类无关,说明带有泛型的方法可以脱离泛型类独立存在。
举个栗子
*/
public calss Test{
public void test<T> (T t){
//***
}
}
//除了这三种,还有一种叫高级泛型,一般用来规范边界
/*
注意:泛型不能使用基本数据类型,如果想要使用基本数据类型,需要使用其封装类(引用类型)来替代
原因:一位内集合底层是Object类型的数组,基本类型的包装类继承自Object,而不能说int\double
等继承自Object
Object是引用类型,int是基本数据类型,泛型泛的是所有的引用类型
*/