これは、インタプリタの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);
}
に
を変えましたか? IDEを使用してコードを匿名クラスとしてリファクタリングし、コンパイルしてリファクタリングするようにコードを修正することをお勧めします。 –
あなたの最後の質問には:生の種類を使用しないでください。 e1とe2は式ではなく式でなければなりません。エラーの場合:BiFunctionは2つの引数をとり、結果を返します。あなたのラムダは3つの引数を取ります:a、b、結果 –
@JB Nizetラムダでaとbを使ってエラーを修正できましたが、最後の質問ではe1とe2を式に変更しましたが、まだキャストする必要があります。 –