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