class A {}
class B extends A {}
class C extends B {}
class D<T> {
D() { }
void fun1(T t) { }
T fun2() { return null; }
}
public class E {
public static void main(String[] args) {
A a = null;
B b = null;
C c = null;
// super
// <? super B>用于泛型類型參數(shù)時(shí)
D<? super B> l1 = new D<A>();
D<? super B> l2 = new D<B>();
D<? super B> l3 = new D<C>(); // 錯(cuò)誤
// <? super B>用于方法參數(shù)時(shí)
l1.fun1(new A()); // 錯(cuò)誤
l1.fun1(new B());
l1.fun1(new C());
// <? super B>用于返回值
a = l1.fun2(); // 錯(cuò)誤
b = l1.fun2(); // 錯(cuò)誤
c = l1.fun2(); // 錯(cuò)誤
// extends
// <? extends B>用于泛型類型參數(shù)
D<? extends B> l4 = new D<A>(); // 錯(cuò)誤
D<? extends B> l5 = new D<B>();
D<? extends B> l6 = new D<C>();
// <? extends B>用于方法參數(shù)
l5.fun1(new A()); // 錯(cuò)誤
l5.fun1(new B()); // 錯(cuò)誤
l5.fun1(new C()); // 錯(cuò)誤
// <? extends B>用于返回值
a = l5.fun2();
b = l5.fun2();
c = l5.fun2(); // 錯(cuò)誤悴了,需要強(qiáng)制類型轉(zhuǎn)換
}
}
// 自限定泛型
class SelfBounded<T extends SelfBounded<T>> {}
// 強(qiáng)制用循環(huán)泛型的方式使用自限定泛型
class A extends SelfBounded<A> {}
class D {}
// 禁止如下使用自限定泛型
class E extends SelfBounded<D> {} // 錯(cuò)誤
// 神奇
class F extends SelfBounded {}
public class SelfBounding {
public static void main(String[] args) { }
}
自限定泛型方法
自限定泛型方法:強(qiáng)制泛型參數(shù)T為循環(huán)泛型類。
class SelfBounded<T extends SelfBounded<T>> {}
class A extends SelfBounded<A> {}
public class SelfBoundingMethods {
private static <T extends SelfBounded<T>> T fun(T arg) {
return arg;
}
public static void main(String[] args) {
A a = fun(new A());
}
}