欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

浅谈Java中的泛型类与泛型方法

程序员文章站 2022-05-23 14:22:31
...

本人是初学Java的小菜鸟,最近刚好学习了一下泛型类跟泛型方法,做了点笔记,如有错误,欢迎指正交流

先看一段用于求解整形数组中的最大值与最小值:

public class pair {       //pair用来存数组中的最大值与最小值
	private int min;
	private int max;

	public pair(int min, int max) {
		this.max = max;
		this.min = min;
	}

	public int getmax() {
		return this.max;
	}

	public int getmin() {
		return this.min;
	}
}

public class sort {  //用来排序
	
	public pair minmax(int num[]) {
		int min = num[0];
		int max = num[0];
		for (int i = 1; i < num.length; i++) {
			if (num[i] >max )
				max = num[i];
			if (num[i]<min )
				min = num[i];
		}
		return new pair<T>(min, max);
	}


public static void main(String[] args) {
		
		intnums[] = new int[] { 1, 2, 3, 5, 9, 11 };
		sort result = new sort();
		System.out.println("max=" + result.minmax(nums).getmax() + "  min=" + result.minmax(nums).getmin());
		
	}

}

输出结果为:浅谈Java中的泛型类与泛型方法

那么问题来了,如果我还想用sort类里的方法得到字符串数组 String []strs=new String(){"a","b","c"}; 的最大最小值,是不是还重写一个pair类呢?

有没有方法让不同类型的数组都共用pair类跟sort类来解决问题,所以能不能将数组的数据类型作为参数传递呢?

Java泛型类与泛型方法就可以实现将数据类型作为参数传递

/**
 * 
 * @author Gemin_Chang
 *
 * @param <T> pair<T> <T>用来确定数据类型,即数据类型参数
 */
public class pair<T> {
	private T min;
	private T max;

	public pair(T min, T max) {
		this.max = max;
		this.min = min;
	}

	public T getmax() {
		return this.max;
	}

	public T getmin() {
		return this.min;
	}
}
public class sort {
	/**
	 * 这是一个泛型方法
	 * 
	 * @param <T  extends Comparable> 使用Comparable接口,这里不是继承,在泛型中extends既可能表示继承也可能表示接口
	 * @param num
	 * @return
	 */
	public static <T extends Comparable> pair<T> minmax(T num[]) {
		T min = num[0];
		T max = num[0];
		for (int i = 1; i < num.length; i++) {
			if (num[i].compareTo(max) > 0) // 只有使用了Comparable接口才能调用compareTo点方法
				max = num[i];
			if (num[i].compareTo(min) < 0)
				min = num[i];
		}
		return new pair<T>(min, max);
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Integer nums[] = new Integer[] { 1, 2, 3, 5, 9, 11 };// 泛型必须是包装类
		sort result = new sort();
		System.out.println("max=" + result.minmax(nums).getmax() + "  min=" + result.minmax(nums).getmin());
		String array[] = new String[] { "aaaa", "bbbb", "cccc" };
		result.minmax(array);
		System.out.println("max=" + result.minmax(array).getmax() + "  min=" + result.minmax(array).getmin());

	}

}

输出结果:

浅谈Java中的泛型类与泛型方法

可以看到,使用相同的pair类和sort类能够解决不同数据类型的数组最值问题

下面用一个具体的Student类来演示一遍,要求是找出学生数组中年龄最大与最小的学生;

public class Student  {
	private String StuName;
	private String StuNo;
	private int StuAge;

	public Student(String stuName, String stuNo, int stuAge) {
		super();
		StuName = stuName;
		StuNo = stuNo;
		StuAge = stuAge;
	}

	public String getStuName() {
		return StuName;
	}

	public void setStuName(String stuName) {
		StuName = stuName;
	}

	public String getStuNo() {
		return StuNo;
	}

	public void setStuNo(String stuNo) {
		StuNo = stuNo;
	}

	public int getStuAge() {
		return StuAge;
	}

	public void setStuAge(int stuAge) {
		StuAge = stuAge;
	}

    @Override
	public String toString() {
		return "Student [StuName=" + StuName + ", StuNo=" + StuNo + ", StuAge=" + StuAge + "]";
	}


}
public class sort {
	/**
	 * 这是一个泛型方法
	 * 
	 * @param <T  extends Comparable> 使用Comparable接口,这里不是继承,在泛型中extends既可能表示继承也可能表示接口
	 * @param num
	 * @return
	 */
	public static <T extends Comparable> pair<T> minmax(T num[]) {
		T min = num[0];
		T max = num[0];
		for (int i = 1; i < num.length; i++) {
			if (num[i].compareTo(max) > 0) // 只有使用了Comparable接口才能调用compareTo点方法
				max = num[i];
			if (num[i].compareTo(min) < 0)
				min = num[i];
		}
		return new pair<T>(min, max);
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		sort result = new sort();
		result.minmax(students);
		System.out.println("max=" + result.minmax(students).getmax().toString() + "  min=" + result.minmax(students).getmin().toString());
	}

}

这么写,编译的时候就会出错,为什么呢?

因为sort类中的minmax方法必须是能用于比较的对象,而Student类是自定义类,默认继承于Java.object类,并没有提供比较方法需要在Student类中加入比较方法,将Student类做以下修改

public class Student implements Comparable {//在Student类中加入Comparable接口
	private String StuName;
	private String StuNo;
	private int StuAge;

	public Student(String stuName, String stuNo, int stuAge) {
		super();
		StuName = stuName;
		StuNo = stuNo;
		StuAge = stuAge;
	}

	public String getStuName() {
		return StuName;
	}

	public void setStuName(String stuName) {
		StuName = stuName;
	}

	public String getStuNo() {
		return StuNo;
	}

	public void setStuNo(String stuNo) {
		StuNo = stuNo;
	}

	public int getStuAge() {
		return StuAge;
	}

	public void setStuAge(int stuAge) {
		StuAge = stuAge;
	}
	
	@Override
	public String toString() {
		return "Student [StuName=" + StuName + ", StuNo=" + StuNo + ", StuAge=" + StuAge + "]";
	}

	@Override
	public int compareTo(Object o) {
                //这样是特别危险的,因为任何一个类型的对象都可以传进来与Student对象比较;
		//建议在类定义时加入泛型定义即Student implements Comparable<Student>  
		if (!(o instanceof Student)) {
			return -1;
		} else {
			Student ob = (Student) o;
			if (this.StuAge > ob.StuAge) {
				return 1;
			} else if (this.StuAge < ob.StuAge) {
				return -1;
			} else
				return 0;

		}
	}

}

再次运行:

浅谈Java中的泛型类与泛型方法

最后做个总结:

上述代码中pair类称为泛型类,sort类中的minmax方法称为泛型方法,泛型的本质就是把数据类型当做参数来传递 ,使代码更加简洁更好维护。

 

相关标签: java