泛型是Java SE 1.5的新特性, 泛型的本质是参数化类型, 也就是说所操作的数据类型被指定为一个参数. 这种参数类型可以用在类、接口和方法的创建中, 分别称为泛型类、泛型接口、泛型方法. Java语言引入泛型的好处是安全简单.
今天就从以下几个方面介绍一下java的泛型: 基础, 泛型关键字, 泛型方法, 泛型类和接口.
基础:
通过集合的泛型了解泛型的基本使用
public void testBasis(){ Listlist = new ArrayList (); // new ArrayList (); } //这是最基本的泛型使用, 就不多说了, 不过要注意的是泛型只能是引用数据类型, 不能是基本类型, 而且泛型只在编译期有效, 在编译后的class文件中是不存在泛型信息的
注意: 泛型只在编译期有效, 在编译后的class文件中是不存在泛型信息的
泛型关键字:
通配符?表示任意引用类型, extends关键字表示子类及其本身, super关键字是表示父类及其本身. 通过一个例子看一下, 解释说明都在例子中
public void testKeyWord() throws Exception { //实例化参数类型必须指明具体类型 List> list = new ArrayList(); //由于list中类型不明确, 所以不能进行添加操作 // list.add("sk"); //通配符?表示任意引用类型 List > list1 = new ArrayList
>(); //list1的参数化类型是一个List, 而这个List也是一个参数化类型, 它的类型是任意类型, 所以list1可以添加任意List类型对象 list1.add(new ArrayList
泛型方法:
java中任何类型必须先定义才能使用, 泛型也是如此. 既然要使用泛型作为参数, 所以要先定义, 泛型的定义在访问修饰符和返回类型之间, 注意不要掉了尖括号
//无返回值有参的方法, 参数为泛型 publicvoid show(T t){ System.out.println("t-=-=" + t); } //有返回值的有参方法, 只有一个参数化类型, 这里定义泛型的方式和上面一样, 也是先定义后使用, 只不过这里的返回类型是泛型 public T get(T t){ return t; } //有返回值的有参方法, 有多个参数化类型, 这里以两个为例 public K get(T t, K k){ return k; } @Test public void testGeneric() throws Exception { show(3); show("generic"); System.out.println("----------------"); System.out.println("我返回Integer类型-" + get(4)); System.out.println("我返回String类型-" + get("returnGeneric")); System.out.println("------------------"); System.out.println("我返回String类型-" + get(1, "a")); System.out.println("我返回Integer类型-" + get("b", 2)); }
本来想写无参的泛型方法, 可是写着写着感觉那样没有什么意义, 不知道各位有什么见解.
泛型类和接口:
写泛型类的时候只需要在类名后面加上泛型即可, 就像这样
public class GenericClass{ public T get(T t){ return t; } public void scr(T t){ System.out.println(t); } public void show(){ GenericClass gc = new GenericClass (); // GenericClass gc1 = new GenericClass gc.get(3); gc.scr(5); //下面2个会报错 // gc1.get(3); // gc1.scr(5); } }();
从上面的例子中可以看到, 参数化类型是在创建对象的时候具体化的, 那么除此之外, 还可以再什么时候具体化参数化类型呢?
如果是在继承或实现中, 可以在子类或实现类中确定具体类型
泛型的应用, 请参看使用java泛型设计通用方法