定義泛型類 Test<U, V extends Test<U, V>>,直接 new Test<>() 編譯報錯,因為型別參數 V 需要是 Test<U, V> 的子類型,形成遞迴定義,無法直接實例化。
需建立一個具體子類別來「閉合」遞迴型別邊界,例如:
class A extends Test<String, A> { }
此時 A 滿足 V extends Test<U, V> 的約束,即可實例化:
Test<String, A> t = new Test<String, A>(); // 或 new A();
class Test<U, V extends Test<U, V>> {
public Test() { System.out.println("success"); }
}
class A extends Test<String, A> { }
public class Main {
public static void main(String[] args) {
Test<String, A> t = new Test<String, A>(); // 輸出 success
}
}