先来看看《Java编程思想》一书里面对于泛型的初衷和作用的解析:
作用1(针对C++):当我们编写了一个很强大的函数,希望拿去使用(通过参数传递进来)时,发现这个函数只能传递一个特定类型的参数比如int类型的,那么对于其他类型的数据就无法使用这个“强大”的函数了,是不是很苦逼,举个例子,int max(int a, int b)函数,我们姑且当它是一个很“强大”的函数,是用来计算传进来的两个参数谁的值最大,但是目前的函数写法就导致只能用于计算两个int整型数据的大小,而不能用于double等等这些类型了,所以需要用到泛型,把函数改写成(C++写法):
template <typename T>
T max(T a, T b){}
这样就达到了将这个函数拓展到多种数据类型的目的了。
作用2(C++/Java):就是上图所说的作用:创造容器类,举个例子,有一个罐子(容器),我们拿它来装东西的,如果我们在罐子贴一张标签说“此罐子只能装水”,限制它就只能装水(某一具体类型),那这个罐子的公用就小很多了,如果我们还想装酸菜(另一类型),还得去重新拿一个标明“用来装酸菜”的罐子,是不是很麻烦。所以解决办法就是泛型,罐子啥都不贴或者贴张标签说“此罐子啥都能装,只要我能装进去的”,那么我们就可以往这个罐子(容器)里塞我们想要塞的任何东西了。
代码示例:
/**
* Holder.java
* @author 吕浪
* @My Email:784975698@qq.com
* @Created on 2016年8月7日
*/
package com;
public class Holder<T>
{
private T a;
public Holder(T a)
{
this.a = a;
}
public void set(T a)
{
this.a = a;
}
public T get()
{
return a;
}
public static void main(String[] args) {
Holder<Integer> h = new Holder<Integer>(6);
System.out.println(h.get());
h.set(7);
System.out.println(h.get());
}
}
运行结果:
6
7
这里的Holder类相当于一个容器,它用来干什么的捏,只是用来存放一个T类型的对象,即对象容器,使用泛型,那么就可以使Holder能够容纳任意类型的对象进来。也就很好得实现了该类的代码复用。又回到之前说过的一点了,Java语言中,很多设计例如这里的泛型还有其他如内部类或继承等等,经常是为了达到这样一个目的:代码复用。或者说得不那么片面来说,就是为了更好(包括少出差错)、更快地编程,以及使程序运行效率更高(C++比java更强调这点),Java比C++更强调前两点,所以有时候java牺牲了程序运行的效率去使程序员更好地编程。为啥牺牲程序效率也要让编程者更舒服?我想这是因为我们每个是人,都有自己的人生,编程终究只是编程,它并不是人生的所有,所以如果能让人以更快地速度去完成同样质量的代码,何乐而不为呢?虽然对于技术狂来说牺牲运行效率是不可容忍的。最后又回到那句话:“编程只是工具,所不同的是你用它来实现的是自己的人生,还是别人的人生。”