天天看点

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);
	}
}