定义
在学习编程语言的变量时,都会了解一个变量的类型,函数的参数类型,那时候有个想法,参数的类型可以是参数吗?
那时候,仅仅只是听过泛型这个词,最近在使用的过程中,了解到了泛型的魅力。
首先我们知道,参数有形参和实参两种,常见的是定义方法时有形参,调用方法时传递实参。每个参数都有自己的类型。
泛型的本质是参数化类型,也就是在泛型使用过程中,操作的数据类型指定为一个参数,通过实参的数据类型,控制形参的数据类型。
举例说明
1
2
3
4
5
6
7
8
|
List arrayList = new ArrayList();
arrayList.add("aaaa");
arrayList.add(100);
for (int i = 0; i < arrayList.size(); i++) {
String item = (String) arrayList.get(i); //强类型转换
System.out.println("泛型测试", "item=" + item);
}
|
运行上面的程序会报异常:
1
|
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
|
ArrayList中的元素类型可以为任意类型,分别添加了一个String 一个Integer,读取的时候使用String的方式,便出现了类型错误。
类似于这种类型转换的问题,可以通过泛型在编译阶段解决。
修改list的初始化代码,编译器可以在编译阶段发现类似问题
1
2
3
|
List<String> arrayList = new ArrayList<String>();
...
//arrayList.add(100);在编译阶段,会报错。
|
泛型类型只在编译阶段有效,泛型类型在逻辑上可以看成是多个不同的类型,实际都是相同的基本类型。
实现最小值函数
设计一个泛型的获取数组最小值的函数,并且这个方法只能接受Number的子类,并且实现了Comparable接口。
1
2
3
4
5
6
7
8
9
10
11
|
//注意: Number并没有实现Comparable
private static <T extends Number & Comparable<? super T>> T min(T[] values) {
if(values == null || values.length == 0)
return null;
T min = values[0];
for(int i = 1; i < values.length; i++) {
if(min.compareTo(values[i]) > 0)
min = values[i];
}
return min;
}
|
测试:
1
2
3
|
int minInteger = min(new Integer[] {1, 2, 3}); //result:1
double minDouble = min(new Double[] {1.2, 2.2, -1d}); //result: -1d
String typeError = min(new String[] {"1", "3"}); //报错
|
参考资料,java 泛型详解、泛型应用
一个人去吃饭逛街,跟自己晚安又失眠。