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>用于泛型类型参数时
D<? super B> l1 = new D<A>();
D<? super B> l2 = new D<B>();
D<? super B> l3 = new D<C>(); // 错误
// <? super B>用于方法参数时
l1.fun1(new A()); // 错误
l1.fun1(new B());
l1.fun1(new C());
// <? super B>用于返回值
a = l1.fun2(); // 错误
b = l1.fun2(); // 错误
c = l1.fun2(); // 错误
// extends
// <? extends B>用于泛型类型参数
D<? extends B> l4 = new D<A>(); // 错误
D<? extends B> l5 = new D<B>();
D<? extends B> l6 = new D<C>();
// <? extends B>用于方法参数
l5.fun1(new A()); // 错误
l5.fun1(new B()); // 错误
l5.fun1(new C()); // 错误
// <? extends B>用于返回值
a = l5.fun2();
b = l5.fun2();
c = l5.fun2(); // 错误,需要强制类型转换
}
}
// 自限定泛型
class SelfBounded<T extends SelfBounded<T>> {}
// 强制用循环泛型的方式使用自限定泛型
class A extends SelfBounded<A> {}
class D {}
// 禁止如下使用自限定泛型
class E extends SelfBounded<D> {} // 错误
// 神奇
class F extends SelfBounded {}
public class SelfBounding {
public static void main(String[] args) { }
}
自限定泛型方法
自限定泛型方法:强制泛型参数T为循环泛型类。
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());
}
}