2016-09-05 10 views
0

クラスを定義し、クラス自己再帰と同じ型の値を返すメソッドを含むメソッドがあります。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)this''キャストは安全ではありません。 'Self'は' Class1 'を拡張すると宣言されていますが、' this'は 'Class1 'の型であり、必ずしも 'Self'であるとは限りません。 – newacct

答えて

5

コンパイルの問題を解決する以外に、問題が何であるかは100%明確ではありません。あなただけでこれにClass4の定義を変更していることを行うことができます。

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

[Live example]

+0

スキムド。無視する... – Bohemian

関連する問題