Java泛型-基础理解
Posted 山水相逢-z
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java泛型-基础理解相关的知识,希望对你有一定的参考价值。
在开发过程中经常会看到泛型或者使用到泛型,所以基于自己的理解,拆分几篇文章由浅入深记录一下。
为什么需要泛型?
泛型这个概念,是在JDK1.5引进来的,其实可以把它理解成一个语法糖,它解决的是什么问题呢?
举个栗子:
假如有以下一个场景,我们需要一个容器类,支持存取不同类型的对象,最基本的实现可能是创建这样一个类:
public class Container
public Container()
private Object value;
public void setValue(Object value)
this.value=value;
public Object getValue()
return value;
我们都知道Object可以指代任何对象,所以这里把容器类的成员变量声明成Object类型,完全可以满足我们存取任何类型对象的需求。来看看如何使用。
存:
Container container1=new Container();
container.setValue(123);
Container container2=new Container();
container2.setValue("test");
Container container3=new Container();
container3.setValue(true);
取:
int a=(int)container.getValue();//123
String b=(String)container.getValue();//"test"
bool c=(boolean)container.getValue();//true
目前为止好像一切都能正常运行,但是你可能也发现有问题了:
每次调用getValue取到返回值后,都需要我们强制类型转换,这就埋下隐患了,因为getValue返回的是Object类型的对象,所以理论上我们可以强转为任何类型,例如:
String a=(String)container1.getValue();//123
上面其实我取出来的是整数 123,但是我们依然可以强转成int类型,这在编译阶段不会有问题,但是当在运行阶段时,就会报出类型转换错误的异常了。
使用泛型实现
上面的问题其实很明显,就是因为我们存和取的时候,其实都不知道具体的类型,这时候泛型就有用了,来改进一下:
public class Container<T>
private T value;
public Container()
public void setValue(T value)
this.value=value;
public T getValue()
return value;
可以看到,这里我们在声明类的时候,在类名后加了<T>
这样一个标示,这样我们就指定了Container是一个泛型类,同时可以看到成员变量value也被我们声明成了T
类型。
其实泛型就是参数化类型,什么意思呢,就是当我们不确定要使用哪种类型的时候,可以通过泛型,将类型以参数的形式进行限定,来看这时候的存取代码:
Container<Integer> container1 = new Container<>();
Container<String> containe2 = new Container<>();
Container<Boolean> containe3 = new Container<>();
container1.setValue(123);
container2.setValue("test");
container3.setValue(true);
int value1 = container1.getValue();//123
String value2 = container1.getValue();//"test"
boolean value3 = container1.getValue();//true
跟最开始的实现一对比,是不是发现更清晰明了了,也不需要我们对返回的数据手动做强制转换。并且往容器类存数据的时候,如果检查到存入的数据类型跟生成容器对象时传入的范型参数类型不一致的话,在编译阶段就会报错,不会将问题隐藏在运行阶段才暴露出来:
container1.setValue(“test”);//error,不能往Integer容器存String类型的数据
这里有一个需要注意的地方,泛型参数不能传入基本类型,比如int,boolean我们需要使用它们的包装类:Integer,Boolean。
以上我们可以看出,泛型有以下优点:
- 编译时的强类型检查
- 避免了类型转换
- 泛型编程可以实现通用算法
总结起来就是:通用和约束。
以上就是泛型的一个基础理解,后续会继续记录泛型分类(泛型类/泛型接口/泛型方法)、泛型擦除等比较深入的内容。
以上是关于Java泛型-基础理解的主要内容,如果未能解决你的问题,请参考以下文章