为什么我们需要泛型?

现在有个需求实现一个求和方法
// 这个方法只支持 int 类型
public int sum(int x, int y ){
return x+y;
}
问题来了。如果我想对 float、double、long类型进行求和又该怎么来?????

不废话上代码:
// 这个方法只支持 int 类型
public int sum(int x, int y) {
return x + y;
}
// 这个方法只支持 float 类型
public float sum(float x, float y) {
return x + y;
}
// 这个方法只支持 double 类型
public double sum(double x, double y) {
return x + y;
}
// 这个方法只支持 long 类型
public long sum(long x, long y) {
return x + y;
}
从这段代码中,我们不难发现方法内的逻辑完全一样,只有传入的参数与返回值不同。那我们可不可以写出一个方法,可以根据传入参数不同自动进行计算?答案是可以的
如果用个方法代替之前的代码 是不是 更好一些
// 这里是段伪代码
public <T> T sum(T x, T y) {
return x + y;
}
/**
此处是个事例代码,
return x + y; 这段是错误的。
原因编译时并不知道x、y是什么类型 也无法进行 + 运算。
此处只是为了介绍 泛型 的应用场景。
*/
泛型的作用 一
适用于多种数据类型执行相同的代码
上段代码可能有人不太了解,接下来再举个栗子。相比List大家都用过。
public static void main(String[] args) {
List list = new ArrayList();
list.add("苍井井");
list.add("波多多");
list.add(666);
for (int i = 0; i < list.size();i++){
String avName = (String) list.get(i);
System.out.println("敬爱的老师:" + avName);
}
}
这段代码有什么问题?
此段代码在编译上是不回报错,但是再运行时就会报"java.lang.Integer cannot be cast to java.lang.String" 类型转换异常

小表弟: List默认的存储类型是Object,add()的时候什么类型都可以存储进去,但是你再get() 取值的时候对数据进行了强制类型转换。把原有的int类型的'666'转换为String导致的。
大表哥:问题我们知道了,接下来我们该如何解决?
这时我们就可以利用泛型来,来约束 List的类型。这样就可以解决List存储类型不统一的问题。相比这是大家再泛型使用最比较多的方式。
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("苍井井");
list.add("波多多");
// list.add(666); 这段再编译时就会报错,改为⬇️
list.add("666");
for (int i = 0; i < list.size();i++){
String avName = list.get(i);
System.out.println("敬爱的老师:" + avName);
}
}
泛型的作用 二
可以对存储类型数据进行类型约束,也节省了在获取的时候进行强制类型转换
网友评论