浅谈Java泛型声明和使用

当我们在编写代码的时候,常常会遇到类似如下的情景:
例如我们需要写一个方法打印一个类型的函数,很简单的我们就会这么写:

public void print(int a)
{
	System.out.println(a);
}

(只是用来举例子,现实中没人会写这么傻的代码)
写完之后,我们在实际使用中发现,不仅仅只有int类型的数可以打印,float型、double型等等类型的数据都可以打印,并且它们打印的逻辑都是完全一样的,那么,难道我们要针对每个类型都写一遍打印方法吗?

泛型应运而生了,从字面上理解,泛型就是“广泛的类型”,也就是说,利用泛型,我们可以达到一个方法或者类可以写一遍就能支持各种类型的使用的效果。我们这就来定义一个泛型:

定义泛型

泛型的声明很简单,就是一对尖括号,尖括号中写下任意的字母或者单词,例如:

class Person<T>
{

}

或者:

class Person<LALALA>
{

}

都是声明了一个使用泛型的类Person,尖括号中的类型是什么名字无所谓,但是需要注意的是,在类中使用到这个类型的地方都要与这个名字保持一致,例如:

class Person<T>
{
	public T print(T a)
	{
		System.out.println(a);
	}
}

这里凡是用T表示的都是一种类型,可以看到,我们定义了一个方法,返回值是T,传入的两个参数也都是T类型的,至于这个T到底是什么,我们在定义这个类的时候并不知道调用者会使用什么类型,T到底是什么需要等到调用的时候具体去声明它,这个下面会讲到,这里的T只是一个代号。

使用泛型

泛型的使用也非常简单,只需要在使用这个类的时候在尖括号中填入你想使用的类型即可,例如:

public static void main(String[] args) {
	Person<Integer> person1 = new Person();
	int a=person1.print(2);//用来打印int类型的数
	Person<Float> person2 = new Person();
	float b=person2.print(2f);//用来打印float类型的数
}

这里我们分别在Person尖括号中写了int和float类型,那么两个person对象的print方法就是分别用来打印int和float类型的。
再比如,大名鼎鼎的ArrayList也使用到了泛型,如:

ArrayList<Person> personList = new ArrayList<Person>();//java8之后的版本这里第二个尖括号可以不写
personList.add(new Person());

这里我们就指定了Arraylist存储Person类型的对象,注意,泛型的尖括号中只能使用引用类型,不能使用基本数据类型,如int,float,double等,细心的读者可能已经注意到了我们在上面调用的例子中用的是Integer和Float类型,这两个类型分别是int和float的封装类型,类似的还有Double类型,Boolean类型等。

到这里你应该已经明白了泛型的基本用法,值得一提的是,我们还可以在一个类中定义多个类型的泛型,用逗号分隔它们,例如:

class Person<T,E>
{

}

调用的时候也一样,用逗号分割:

Person<Integer,Float> person = new Person<>();

你可能感兴趣的:(Java,泛型,java)