2016-04-03 71 views
1

這是一個使用解釋器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); 

} 
+0

您可以包括'Expression'的代碼?我建議使用您的IDE將代碼重構爲匿名類,修復代碼以便編譯並重構它。 –

+6

對於你的最後一個問題:不要使用原始類型。 e1和e2應該是表達式,而不是表達式。對於錯誤:BiFunction接受兩個參數,並返回結果。你的lambda需要3個參數:a,b和結果。 –

+0

@JB Nizet謝謝,我可以修正錯誤,只需使用lambda上的a和b,但對於最後一個問題,我將e1和e2更改爲表達式,而且我仍然需要施放。 –

回答

0

Acording到JB Nizet評論這example我發現,我只需要使用A和B在lambda參數。

這裏是正確的代碼。

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是類BinaryOpT>上的通用類型。

我不知道如何正確使用lambdas和泛型。

更新:修正了一些錯誤,我改變

public T interpret(IContext context); 

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

其中一個問題是'IContext'與'IContext '不同# –

+0

是的,當我昨天測試我的代碼時,我必須修正一些錯誤。 –

相關問題