最近看代码经常遇到泛型内容,怎奈自己这一块掌握的不好,各种看不懂,所以拿出一点时间专门研究一下,大体上是根据《java核心技术卷一》的例子和解释来学习的,这里记录一下大致的情况,一是巩固整理相关知识点,二是方便以后更快的复习。
首先,使用泛型的目的:编写的代码可以被很多不同类型的对象所重用。通俗的讲就是做了一个模板,大家根据自己的类型往上套就行了。
本篇从三个层次来说一下泛型:第一是泛型类,第二是泛型函数,第三是类型变量的限定。
泛型类:
这里比较简单,看个例子就基本上掌握了,需要注意的一点:在java库中,一般使用变量E表示集合的元素类型,K和V表示表的关键字和值得类型,T(需要时还可以使用临近的字母U和S)表示任意类型。
构造一个泛型类:定义一个泛型类,有两个私有变量
/*
* 定义一个泛型的类
*/
class Pat<T,U>
{
private T first;
private U second;
public T getFirst() {
return this.first;
}
public U getSecond() {
return this.second;
}
public Pat(){
}
public Pat(T frist,U second)
{
this.first=frist;
this.second=second;
}
}
在测试类中调用该泛型类的函数:
/*
* 调用泛型类的函数
*/
Pat<String,Integer> s=new Pat<String ,Integer>("王五",20);
System.out.println("姓名:"+s.getFirst()+"\n年龄: "+s.getSecond());
泛型函数(方法):
泛型方法的定义比泛型函数复杂一点,这里示例是获得一个数组中最中间那个元素:
class ArrayAlg
{
/*
* 定义泛型方法
* ? static 后面那个<T>感觉可以省略,不晓得怎么个情况
* 具体功能:3个T的作用
* <T>说明这是一个泛型函数
* T说明返回类型
* T[]表示参数类型
*/
public static <T> T getMiddle(T[] a)
{
return a[a.length/2];
}
}
相关的点在注释中写得很清楚了,这里就不多说明。测试类中调用:
/*
* 调用泛型函数
*/
String[] names={"张三","李四","王五","赵六"};
String middle=ArrayAlg.<String>getMiddle(names);//调用泛型函数方法
String middle1=ArrayAlg.getMiddle(names);//names中类型一致时可以,但是倘若有int和double等容易报错
System.out.println("middle is:"+middle);
类型变量的限定:
这个主要针对具有compareTo()方法来进行比较的代码而言,因为不确定T所属的类是不是具有该方法。所有使用这个方法的函数的T将限定为实现Comparable接口。该接口只包含一个compareTo()方法。所以,一般定义方式如下:
public static <T extends Comparable> T min(T[] a).....下面是查找一个数组中最小的元素的方法:
public static <T extends Comparable> T min(T[] a)
{
if(a==null||a.length==0)return null;
T smallest=a[0];
for(int i=0;i<a.length;i++)
{
if(smallest.compareTo(a[i])>0)smallest=a[i];
}
return smallest;
}
这里对接口
Comparable使用extends而不是implement。《java核心技术卷一》给出的解释是:<T extends Bounding Type>表示T应该是绑定类型的子类型(subtype)。T和绑定类型既可以是类,也可以是接口。选择extends而不是implement原因是extends更接近子类型的概念。
在测试类中调用:
/*
* 类型变量的限定测试
*/
String[] ages={"18","19","30","12"};
String minn=ArrayAlg.<String>min(ages);
System.out.println("min is:"+minn);
OK,暂时先写到这里。