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);
}
}
java泛型之三——参数泛型上下限
最新推荐文章于 2023-06-12 12:55:58 发布