java泛型程序设计

 class Pair<T>{

	private T first;
	private T second;
	
	public Pair(){
		this.first=null;
		this.second=null;
	}
	public Pair(T first,T second){
		this.first=first;
		this.second=second;		
	}
	public T getFirst() {
		return first;
	}
	public void setFirst(T first) {
		this.first = first;
	}
	public T getSecond() {
		return second;
	}
	public void setSecond(T second) {
		this.second = second;
	}

	
}

尖括号(<>)内是类型参数。可以用具体的类型实例化泛化类型eg Pair <String>     Pair<String ,String>

方法也可以使用泛型。请看!!

 class ArrayAlg{
		@SafeVarargs
		public static <T> T getMiddle(T... a){
			return a[a.length/2];	
		}
  }

 ...表示可变参数,传入的阐述都会被放入到一个数组当中(数组名就是...后面的),之后可以用for(T i: a){…………}

上例可以这样实例化:String middle=ArrayAlg.<String>getMiddle("John","Q.","Public");

有时候我们需要对类型变量加以约束。例如在下例子当中变量smallest的类型是T,这意味这它可以是任意一个变量的类。

怎样才能确定T所属的类有compareTo方法呢!!!!!------对类型变量设置限制。<T extends Comparable >

		public static <T extends Comparable> T min(T[] a){
			if(a==null||a.length==0) return null;
			T smallest =a[0];
			for (int i=1;i<a.length;i++){
				if(smallest.compareTo(a[i])>0) smallest=a[i];//如何确保T类型有方法!!!!!
			}
			return smallest;
		}

   限定中使用extends,因为extends 与子类的概念更接近!!!

    多个限制 <T extends Comparable & Serializable>

 

虚拟机中没有泛型类型对象----所有的对象都数据普通类,---无论何时定义了一个泛型类型,都会自动提供一个原始类型(raw type),原始类型的名字就是删去类型参数后的泛型类型名,擦除(erased)类型变量,并替换为限定类型!!!(无限定的变量用Object)

通配符类型,允许类型参数变化,例如:Pair<? extends Employee>表示任何泛型Pair,他的类型参数必须是Employee的子类,如Pair<Manager>,但不是Pair<String>!!  --这儿假设Employee拓展出Manager

通配符的超类型限定(supertype bound) eg ?super Manager 这个通配符限定为Manager的所有超类型!!

Comparable接口本身就是一个泛型类型 申明如下:

public interface Comparable<T>{

public int compareTo(T other)

}

egString类实现了Comparable<String> 则它的compareTo方法申明如下:public int compareTo(String other)

如果我们没有指明Comparable接口当中的<T>类型,那么实现的是需要强制类型转换---Object

<T extends Comparabel<? super T>>//对超类进行限定!!!!

完整测试代码如下:

​
package general;
import java.time.LocalDate;
import java.time.chrono.*;

public class Test {

	public static void main(String[] args) {
		LocalDate[] birdthdays={
				LocalDate.of(2005, 12, 9),
				LocalDate.of(2015, 1, 9),
				LocalDate.of(2009, 12, 6),
				
		};
		Pair<LocalDate> mm=ArrayAlg.minmax(birdthdays);
		System.out.println("min="+mm.getFirst());
		System.out.println("max="+mm.getSecond());
	}

}

 class Pair<T>{
	 
	private T first;
	private T second;
	
	public Pair(){
		this.first=null;
		this.second=null;
	}
	public Pair(T first,T second){
		this.first=first;
		this.second=second;		
	}
	public T getFirst() {
		return first;
	}
	public void setFirst(T first) {
		this.first = first;
	}
	public T getSecond() {
		return second;
	}
	public void setSecond(T second) {
		this.second = second;
	}

}
 class ArrayAlg{
		@SafeVarargs
		public static <T> T getMiddle(T... a){
			return a[a.length/2];	
		}
		public static <T extends Comparable> T min(T[] a){
			if(a==null||a.length==0) return null;
			T smallest =a[0];
			for (int i=1;i<a.length;i++){
				if(smallest.compareTo(a[i])>0) smallest=a[i];
			}
			return smallest;
		}
		public static <T extends Comparable> Pair<T> minmax(T[] a){
			if (a==null||a.length==0)return null;
			T min=a[0];
			T max=a[0];
			for (int i=1;i<a.length;i++){
				if(min.compareTo(a[i])>0)min= a[i];
				if(max.compareTo(a[i])<0) max=a[i];
			}
			return new Pair<>(max,min); //返回新建的类的引用!
		}
		
 }

​

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值