2016-04-03 21 views
1

これは、インタプリタのGOFパターンを使用する表現型評価プログラムで、BinaryOpは非終端式です。なぜこのJavaラムダ式パラメータにエラーがありますか?

public class BinaryOP<T> implements Expression<T> { 

    private Expression<T> e1; 
    private Expression<T> e2; 
    private BiFunction<Expression<T>, Expression<T>, T> f; 

    public BinaryOp(Expression<T> e1, Expression<T> e2, 
      BiFunction<Expression<T>, Expression<T>, T> f){ 
     this.e1 = e1; this.e2 = e2; this.f = f; 
    } 

    @Override 
    public <T> T interpret(IContext context){ 
     return (T)f.apply(e1, e2); 
    } 
} 

変数は終端式です。

public class Variable<T> implements Expression<T> {  
    private T v; 

    public Variable(T v){ 
     this.v = v; 
    } 

    @Override 
    public <T> T interpret(IContext context){ 
     return (T)context.recognize(v); 
    } 
} 

とBタイプ式のものであり、結果が整数¿なぜエラーが返された場合、ラムダ、そのパラメータにエラーを使用する場合、私はエラーを取得BiFunction和を定義します?。

public class AritmeticInterpreter 
{ 
    public static void main(String[] args) {  
    IContext<Integer> ctxArimetic = value -> value; 

    BiFunction<Expression<Integer>, Expression<Integer>, Integer> sum 
    //Error = incompatible types: incompatible parameter types in lambda expression          
       = (a, b, result) -> { 
       return (Integer)a.interpret(ctxArimetic) + (Integer)b.interpret(ctxArimetic); 
      }; 
    } 
} 

このエラーの原因は何ですか。戻り値の型は別の式ですか? 私は式に解釈するメソッドの戻り値の種類を変更した場合、私はこのような二つの表現aとbの合計することができません:彼らは整数ではありませんので、

(a, b) -> a + b 

を。

このタイトルの部分はありませんが、メソッドのキャスト解釈を取り除くことはできますか?私はJavaコンパイラがジェネリック型を消去することを知っていますが、¿そこには方法がありますか?

更新:

ここにExpressionインターフェイスがあります。

JB Nizetコメントとこの exampleた内容に応じて、
public interface Expression<T> { 

    public <T> T interpret(IContext context); 

} 
+0

public T interpret(IContext context); 

を変えましたか? IDEを使用してコードを匿名クラスとしてリファクタリングし、コンパイルしてリファクタリングするようにコードを修正することをお勧めします。 –

+6

あなたの最後の質問には:生の種類を使用しないでください。 e1とe2は式ではなく式でなければなりません。エラーの場合:BiFunctionは2つの引数をとり、結果を返します。あなたのラムダは3つの引数を取ります:a、b、結果 –

+0

@JB Nizetラムダでaとbを使ってエラーを修正できましたが、最後の質問ではe1とe2を式に変更しましたが、まだキャストする必要があります。 –

答えて

0

私はちょうどラムダで引数としてaとbを使用する必要があることがわかりました。

ここに正しいコードがあります。

public static void main(String[] args) { 

    IContext<Integer> ctxArimetic = value -> value;  

    BiFunction<Expression<Integer>, Expression<Integer>, Integer> sum 
      = (a, b) -> { 
     return a.interpret(ctxArimetic) + b.interpret(ctxArimetic); 
    }; 

} 

と最後の質問です。 BinaryOPクラスの

私はこの変更を行う:

@Override 
public T interpret(IContext<T> context){ 
     return f.apply(e1, e2); 
} 

と式インタフェース上:

public interface Expression<T> { 

     public T interpret(IContext<T> context); 

} 

私が解釈する方法をパラメータ化するので、このエラーがであり、このメソッドは、いずれかを返すことができますオブジェクト。私はコンパイラが「T#2はT#1型とは異なる」というエラーを出力したことを覚えています。T#2は汎用パラメータ<T>解釈メソッドであり、T#1はBinaryOp < T>のジェネリック型です。

ラムダとジェネリックスを正しく使用する方法がわかりませんでした。

更新:いくつかのエラーを修正するには、私はあなたが `Expression`ためのコードを含むことができる

public T interpret(IContext<T> context); 
+0

問題の1つは、 'IContext'が' IContext 'と異なっているということです。 –

+0

昨日私のコードをテストするときに、いくつかのエラーを修正する必要があります。 –

関連する問題