2016-06-27 25 views
-8

私は次のようにIServiceインタフェースを実装しているAddServiceクラスとのプログラムがあります:コードのコンパイルと実行の上Java-8で継承を実装する方法は?

IService.java

public interface IService { 

    Integer add(int x, int y); 
} 

AddService.java

import com.test.service.IService; 

public class AddService implements IService { 

    @Override 
    public Integer add(int x, int y) { 
     return x + y; 
    } 
} 

を申し訳ございませんが、上記の実装を変更するとすぐにJava-8が以下のようにBiFunctionを提供すると、IDEはコンパイル時に不平を言ってくる。

IService.java

import java.util.function.BiFunction; 

public interface IService { 

    BiFunction<Integer, Integer, Integer> add(x, y); 
} 

AddService.java

import java.util.function.BiFunction; 
import com.test.service.IService; 

public class AddService implements IService { 

    @Override 
    public BiFunction<Integer, Integer, Integer> add = (x, y) -> { 
     return x + y; 
    }; 

} 

私はエラーを解決し、私のプログラムを実行することができますどのように任意のアイデア?

+3

'add'はインターフェイスの(暗黙の)' static final'フィールドであり、ここで継承はありません。 – Tom

+1

Java 8では、クラスの作成方法は変更されません。あなたはあなたの 'IService'実装の代わりに'(x、y) - > x + y'を使うことができます(クラスを全く書いていません) – zapl

+0

@Tom:addを 'add(x、y)'に変更すると、コンパイル時のエラーとして - "xはreslovedすることはできません"、任意のアイデアはどのように私はそれを修正することができますか? – Arpit

答えて

1

IServiceが理由で作成され、実際の実装が簡単ではないと仮定して、私はこのような非トライアル実装を作成します。

public interface IService { 
    int op(int x, int y); 
} 

public enum OpService implements IService { 
    ADD { 
     @Override 
     public int op(int x, int y) { 
      return x + y; 
     } 
    }, 
    MINUS { 
     @Override 
     public int op(int x, int y) { 
      return x - y; 
     } 
    } 
} 

class A { 
    public static void main(String[] args) { 
     IntBinaryOperator add = OpService.ADD::op; 
     IntBinaryOperator minus = OpService.MINUS::op; 

     System.out.println(add.applyAsInt(2, 3)); 
    } 
} 

プリント

5 

しかし、あなたがしたいすべてが一緒に2つの数値を追加している場合、私はちょうどあなたが誤解し+

+3

本当ですか?これはあなたがこれを書く方法です?あなたが使用していないインターフェースを宣言し、 'enum'を介して実装します。 'IService'ではなくIntBinaryOperatorを最初に実装するのはどうでしょうか?または、メソッドの参照用に2つの静的メソッドを作成するだけです。 – Holger

+0

@Holgerこの単純なケースでは、ほとんどのコードを削除できますが、私は同意します。ブライアンの解決策で十分です。しかし、 'IService'が何らかの理由で作成されていて、その例が自明ではないと仮定すると、これは私が使ったパターンです。 –

+0

@Holger 2つの数字を一緒に追加したいだけなら、lambdasは使用しません。 '+' –

0

を使用します。あなたは、Java 8で

public void someMethod(IService addService) { 
    System.out.println(addService.add(2, 4)); 
} 

のような方法があると、あなたは現在、代わりに適切IServiceを実装し、

public void anotherMethod() { 
    someMethod(new AddService()); 
} 
ような何かをするので

public void anotherMethod() { 
    someMethod((x, y) -> x + y); 
} 

のようにそのメソッドを呼び出すことが許可されています

ラムダは、すべての機能インターフェイスの実装として機能します。インターフェイスが存在するため、IServiceインターフェイスを追加する必要はありません。代わりに行うことができます

public void someMethod2(BiFunction<Integer, Integer, Integer> addService) { 
    System.out.println(addService.apply(2, 4)); 
} 

public void anotherMethod() { 
    someMethod((x, y) -> x + y); 
} 

これはまだ動作します。同じラムダは今度はIServiceの代わりにBiFunctionとして扱われます。

3

ラムダ式では、コードデータと表記できます。あなたは書くことができます:

IService addService = (x, y) -> x + y; 

IServiceを実装変数addService宣言しています。ベターは、IServiceを取り除くと使用IntBinaryOperatorを取得:

IntBinaryOperator add = (x, y) -> x + y; 
IntBinaryOperator subtract = (x, y) -> x - y; 
... 

、あなたがそうでなければnew AddService()を使用しているだろうaddを使用しています。

関連する問題