数据结构和算法-->泛型

函数对象:java

package test;

import java.util.Collection;
import java.util.Comparator;

/**
 * CaseInsensitiveCompare 就是函数对象
 * 具体使用是在main方法中的System.out.println(findMax(arr,new CaseInsensitiveCompare()));
 * @author Administrator
 *
 */
public class GenericMemoryCell {
	
	public static <AnyType> AnyType findMax(AnyType[] arr, Comparator<? super AnyType> cmp){
		
		int maxIndex = 0;
		
		for(int i=1; i<arr.length; i++){
			if(cmp.compare(arr[i], arr[maxIndex]) > 0 ){
				maxIndex = i;
			}
		}
		
		return arr[maxIndex];
		
	}
	
	public static void main(String[] args) {
		
		String[] arr = {"ZEBRA","alligator","crocodile"};
		System.out.println(findMax(arr,new CaseInsensitiveCompare()));
	}
	
}

class CaseInsensitiveCompare implements Comparator<String>{

	@Override
	public int compare(String o1, String o2) {
		// TODO Auto-generated method stub
		return o1.compareToIgnoreCase(o2);
	}
	
}

T表明泛型
?是通配符,不能用于声明阶段数组

 

使用泛型的一个比较大的做用是方便简单而且避免了数组的类型兼容性致使的问题并且将运行时异常提早到了编译时异常。
好比,在泛型以前若是要达到泛型的目的,可使用Object和接口两种形式:
 ide

使用Object的一个问题是须要强制类型转换。写入的时候先转换成了object而后读出的时候仍然是object所以要作强制类型转换。
使用接口形式:函数

这种方式必需要求传递的对象实现相应的接口,3d

数组类型的兼容性:
设Employee IS-A Person,那么是否是也意味着Employee[] IS-A Person[],换句话说若是一个程序接收Person[]做为参数,那么能不能将Emplyee[]
做为参数传递?其实是能够的,可是还有一种比较复杂的状况,假设除了Employee外还有Student IS-A Person,此时考虑下面两条复制语句:
Person[] arr = new Eemployee[5];
arr[0] = new Student(...);
两句都能编译,而实际上arr[0]引用了一个Employee,但是Student IS-NOT-A Employee,这样就产生了混乱。运行时也不报错由于不存在类型转换。
好比上例中的接口形式的代码。code

使用泛型时对象

在第五行,例如类GenericMemoryCell<String>的write方法须要一个String,传入其余类型将产生一个编译错误。
也能够声明接口是泛型的好比Comparable,在java5以前不是泛型的他的compareTo方法接收一个Objet做为参数,所以传递给他的参数即便不是个
合理的类型也会编译,只是在运行的时候报ClassCaseException。可是使用泛型的话在编译器就能提示处错误。blog

泛型集合不具备类型兼容性接口

可使用通配符来实现如上要求编译器

通配符能够不带任何限制使用好比<?>至关于<? extends Object> 或者用super来标识超类而非子类

 

泛型方法:

有下列缘由使用泛型方法:

相关文章
相关标签/搜索