java基础巩固之泛型(上)

最近看代码经常遇到泛型内容,怎奈自己这一块掌握的不好,各种看不懂,所以拿出一点时间专门研究一下,大体上是根据《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,暂时先写到这里。

志在山顶的人,不会贪念山腰的风景。

java基础巩固之泛型(上)

相关文章:

你感兴趣的文章:

标签云: