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