2016-09-05 54 views
0

有一種技術來定義類,其中包含一個方法,返回一個與class - self遞歸類型相同的值。如何停止Java泛型中的自我遞歸?

但是使用這個,是否有可能停止遞歸?

一些代碼:

public class StopSelfRecursion { 

    // base class 
    static class Class1<Self extends Class1<Self,T>, T> { 
     public Self getMyself() { 
     return (Self) this; 
     } 
    } 

    // derived 1 
    static class Class2<Self extends Class2<Self, T>, T> extends Class1<Self, T> { 
    } 

    // derived 2 
    static class Class3<Self extends Class2<Self, T>, T> extends Class2<Self, T> { 
    } 

    // want to stop recursion; want Class4 has only one parameter 
    static class Class4<T> extends Class3<Class3, T> { 
    } 

    public static void main(String[] args) { 

     Class1<?, Integer> v1 = new Class1<>(); 

     Class2<?, Integer> v2 = new Class2<>(); 

     Class3<?, Integer> v3 = new Class3<>(); 

     System.out.println(v1.toString()); 
     System.out.println(v2.toString()); 
     System.out.println(v3.toString()); 


    } 
} 

如果它是不可能停止遞歸,那麼爲什麼呢?

如果沒有邏輯理由不能阻止它,那麼在下一個Java版本中添加此功能又該如何呢?

例如,可以添加關鍵字ThisClass什麼的。

+0

你可以發佈你聲稱存在此遞歸技術的實際例子嗎?我有一種感覺,你在這裏展示的例子忽略了這一點。 – markspace

+0

'(自己)這個'演員是不安全的。 'Self'被宣佈爲擴展'Class1 ',但'This'(類型'Class1 ')不一定是'Self'。 – newacct

回答

5

我不是100%清楚問題是什麼,除了解決編譯問題。你可以通過簡單地改變Class4的定義是:

static class Class4<T> extends Class3<Class4<T>, T> 
             ^^ 

[Live example]

+0

糟糕。脫脂。忽視... – Bohemian