這是一個使用解釋器GOF模式的aritmetic表達式求值器,BinaryOp是一個非終端表達式。爲什麼這個Java lambda表達式參數有錯誤?
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);
}
}
當定義雙功能總和使用的λ,它的參數的錯誤,當我得到一個錯誤,如果a和b是類型表達的和的結果返回一個整數¿爲什麼這是錯誤?
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接口。
public interface Expression<T> {
public <T> T interpret(IContext context);
}
您可以包括'Expression'的代碼?我建議使用您的IDE將代碼重構爲匿名類,修復代碼以便編譯並重構它。 –
對於你的最後一個問題:不要使用原始類型。 e1和e2應該是表達式,而不是表達式。對於錯誤:BiFunction接受兩個參數,並返回結果。你的lambda需要3個參數:a,b和結果。 –
@JB Nizet謝謝,我可以修正錯誤,只需使用lambda上的a和b,但對於最後一個問題,我將e1和e2更改爲表達式,而且我仍然需要施放。 –