天天看點

java泛型之三——參數泛型上下限

class A {
}
class B extends A implements Comparable<B>{
	@Override
	public int compareTo(B o) {
		return 0;
	}
}
class B1 extends B {
}
interface Inf1 {
}
class C implements Inf1 {
}
class D extends A implements Inf1 {
}
class Point<T,M,K> {
	public T x;
	public M y;
	public K k;
}
class Test {
	/**強制要求show1參數Point對象被建立時,指定泛型
	 * T為A類(及其子類);
	 * M為Inf1(及其實作類)
	 * K為B(及其子類)
	 * */
	public void show1(Point<? extends A, ? extends Inf1, ? super B> p) { 
	}
	public static void main(String[] args) {
		Point<A,Inf1,B> p1 = new Point<A,Inf1,B>();
		Point<D,D,A> p2 = new Point<D,D,A>();
		Point<A,B,C> p3 = new Point<A,B,C>();
		Test test = new Test();
		/**對*/
		test.show1(p1);
		/**對*/
		test.show1(p2);
		/**錯,應為建立對象p3時,指定的M的泛型為B類,不符合show1函數中強制要
		 *     求的M為Inf1(及其實作類)
		 *     并且指定的C類也不符合show1函數強制要求的K為B(及其父類)
		 *     */
        test.show1(p3);
	}
}
class Dog<F> {
	public F x;
	/**強制要求show1參數Point對象被建立時,指定泛型
	 * T為F及其子類(包括接口)
	 * M為F及其父類(包括接口)
	 * K為F及其子類(包括接口)
	 * */
	public void show1(Point<? extends F, ? super F, ? extends F> p) {
	}
	/**
	 * 強制要求show1參數Point對象被建立時,指定泛型
	 * T為F及其子類(包括接口)
	 * M為F及其父類(包括接口)
	 * K為Comparable的實作類,并且是F及其父類(包括接口),即上限是Comparable,下限是F
	 */
	public void show2(Point<? extends F, ? super F, ? extends Comparable<? super F>>  p) {
	}
	/**
	 * 下面代碼中Dog<B>使得F為B類建立對象p時符合:
	 * (1)B1為B的子類——對應T為F及其子類;
	 * (2)A為B及其父類——對應M為F及其父類;
	 * (3)B為Comparable的實作類,并且是B的父類——對應K為Comparable的實作類,并且是F及其父類;
	 * 是以對象p可以使用show2函數的參數
	 */
	public static void main(String[] args) {
		Dog<B> dog = new Dog<B>();
		Point<B1,A, B> p = new Point<B1,A, B>();
		dog.show2(p);
	}
}