一 泛型的概念和作用
在编程中,我们定义方法参数,返回的内容等都需要一个类型,这里就涉及到了参数化类型,而泛型就是这个参数化类型,即在不创建新的类型下,来指定或者限制形参的类型。
举个例子讲,比如说我定义了一个int型参数来进行加法运算,那么我们输入两个int类型的整数就可以正常实现运行效果。但是如果这个时候我们需要计算float类型的加法,这个时候就不能用这个方法了,需要重新定义一个包含float类型形参的方法来计算,那么这样就会非常麻烦,因此泛型的强大就体现出来了。
二 泛型的使用
泛型一般有三种使用方式,分别为:泛型类、泛型接口、泛型方法,并且泛型通常有泛型标识,一般用T、E、K、V来表示,下面分别来具体讲一下
2.1 泛型类
基本用法:
public class Math<E>{
private E num;
private E[] data;
//参数类型都由外部指定
public Math(E num) {
this.num = num;
}
public E getNum(){
return num;
}
//注意实例化的时候,必须指定E的具体类型,而且必须注意
//这里的类型必须是包装类
//另外,也可以实例化的时候不带类型,这个时候就是任意类型,如下第二行
Math<Integer> math = new Math<Integer>(123);
Math math = new Math(123);
2.2 泛型接口
泛型接口和泛型类差不多,基本用法:
public interface Math<E>{
public E add();
}
//在声明类的时候,需要把接口的泛型声明一起加上
//如果此时继承接口时接口传入了实际的参数类型,
//那么类里面用到泛型的地方都要变为这个参数类型
class Add<E> implements Math<E>{
@Override
public E add(){
return null;
}
}
2.3 泛型方法
泛型方法和前面两个不同,之前我们在泛型类里面加入了类似看起来像泛型方法的东西,但是其实这只是一个类的成员方法,只是返回值变成泛型标识了而已,标准的泛型方法应该是这样的:
//<E>表示声明这个方法是泛型方法,参数里面的E则是和这个<E>类型保持一致
public <E> E add(E num){
return null;
}
这是基本泛型的一些用法,具体更多细节之后补充。