一、 序言
一直在用的语言是Java,本以为掌握的已经不错了,但最近面试才发现之前自己只是停留在熟料使用的状态,距离编写出优雅,高可复用的代码还有一定的距离。强烈建议大家有机会一定要去看一下JDK源码,写的非常漂亮,可以学到不少东西!
二、 泛型
- 为什么要使用泛型?
进行日常开发时,当面对有重复的代码时,我们自然而然的将公共部分抽取出来封装成一个函数或方法,然后进行频繁调用。同样的道理,在进行功能开发时,很有可能两个方法的功能,实现逻辑一样,只是对应的数据类型不同,那么考虑能不能再抽象一下,进行一下更高层次的“封装”呢?答案是肯定的,使用Java提供的泛型就可以实现这一功能!
通过泛型可以定义类型安全的数据结构(类型安全),而无须使用实际的数据类型(可扩展)。这能够显著提高性能并得到更高质量的代码(高性能),这样就可以重用数据处理算法,而无须复制类型特定的代码(可重用)。在概念上,泛型类似于 C++ 模板,但是在实现和功能方面存在明显差异。
Java泛型的核心概念:告诉编译器使用什么类型,然后编译器帮你处理一切细节。
-
泛型使用语法
泛型的具体使用有泛型类,泛型接口和泛型方法,在不同层次进行合理使用可以极大的增强程序的可扩展性,减少冗余代码。贴一篇总结的很好的博客 -
泛型类
泛型类在类名后面添加了类型参数声明部分,一般是,在JDK中泛型类经常用在容器类中!class GenericClass<T> { private T attr; public GenericClass(T attr) { this.attr = attr; } public T getAttr() { return attr; } public void setAttr(T attr) { this.attr = attr; } }
-
泛型接口
泛型接口与泛型类的定义及使用基本相同。泛型接口常被用在各种类的生产器中
public interface Generator<T> {
public T next();
}
- 泛型方法
泛型类,是在实例化类的时候指明泛型的具体类型;泛型方法,是在调用方法的时候指明泛型的具体类型 。
/**
* 泛型方法的基本介绍
* @param tClass 传入的泛型实参
* @return T 返回值为T类型
* 说明:
* 1)public 与 返回值中间<T>非常重要,可以理解为声明此方法为泛型方法。
* 2)只有声明了<T>的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。
* 3)<T>表明该方法将使用泛型类型T,此时才可以在方法中使用泛型类型T。
* 4)与泛型类的定义一样,此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型。
*/
public <T> T genericMethod(Class<T> tClass)throws InstantiationException ,
IllegalAccessException{
T instance = tClass.newInstance();
return instance;
}
注意泛型方法与泛型类中方法的区别
6. 泛型使用命名习惯
为了更好地去理解泛型,我们也需要去理解java泛型的命名规范。为了与java关键字区别开来,java泛型参数只是使用一个大写字母来定义。各种常用泛型参数的意义如下:
E — Element,常用在java Collection里,如:List,Iterator,Set
K,V — Key,Value,代表Map的键值对
N — Number,数字
T — Type,类型,如String,Integer等等
S,U,V etc. - 2nd, 3rd, 4th 类型,和T的用法一样