2012-02-02 9 views
0

ジェネリックスのコードを見ています。私はコードを理解するのが面倒ですが、Tのパラメータ化された使用法の使用法については理解できませんでした。なぜ、TはなぜEとRで動作するようにしないのですか? Rはツリーを指します。コードではジェネリックスの使用法を補っていません。コードをexpalinしてください。ジェネリックスコードはなぜ使用するTパラメータを理解していません

abstract class Tree<E> { 
    public interface Visitor<E, R> { 
     public R leaf(E elt); 

     public R branch(R left, R right); 
    } 

    public abstract <R> R visit(Visitor<E, R> v); 

    public static <T> Tree<T> leaf(final T e) { 
     return new Tree<T>() { 
      public <R> R visit(Visitor<T, R> v) { 
       return v.leaf(e); 
      } 
     }; 
    } 

    public static <T> Tree<T> branch(final Tree<T> l, final Tree<T> r) { 
     return new Tree<T>() { 
      public <R> R visit(Visitor<T, R> v) { 
       return v.branch(l.visit(v), r.visit(v)); 
      } 
     }; 
    } 
} 
+1

'static'メソッドで' T'が使用されていることに注意してください。 – alphazero

答えて

3

このクラスのジェネリック型<E>は、クラスの静的メソッドやフィールドの表示されません。したがって、<T><E>に置き換えることができます。名前は唯一の名前ですが、実際にはこの<E>は、Tree<E>とは異なります。以下のように署名を変更して、コンパイル時のエラーメッセージを得ることができます。

public static Tree<E> leaf(final E e) 

あいまいさを削除するには、それは静的メソッドで異なるジェネリック型の名前を使用するためにはるかに良いです。

+0

ありがとう、ありがとうございます。 – Curious

2

R結果の訪問者。

@alphazeroはTは、静的な使用のためです言ったように:

Tree<String> helloLeaf = Tree.leaf("Hello"); 

スタイルは、学術的なC++ STLのビットを連想させる、多分ちらほらoverengineeredです。

0

分岐メソッドによって返される型は、Treeの他の特定のインスタンスの型とは関係がありません。

私が見る限り、これはあなたが置いた唯一の制限は、インスタンスメソッドとして静的メソッドを呼び出す場合です。本当にやるべきことはありません)。

そして、そのスタイルは学術的です。最終的な議論を地元の地元に引き寄せても、困惑以外は何も買わない。かわいいです、それだけです。 LISPが好きな人は、そのようなエントリの障壁のためにそれを好きです。

関連する問題