java泛型之三——参数泛型上下限

来源:互联网 发布:软件研发能力评估 编辑:程序博客网 时间:2024/05/19 01:32
class A {}class B extends A implements Comparable<B>{@Overridepublic 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);}}

原创粉丝点击