2017-10-24 10 views
4

オブジェクト:JavaのハッシュコードとJava 8の機能インターフェースのために等しいが、私は以下のように見えるいくつかのコード持って

import java.util.ArrayList; 
import java.util.List; 
import java.util.function.Function; 

class MyObj { 
    private final Double aDouble; 

    public MyObj(Double aDouble) { 
     this.aDouble = aDouble; 
    } 
} 

class Main { 
    public static void main(String[] args) { 
     List<Function<MyObj, String>> functionList1 = new ArrayList<>(); 
     List<Function<MyObj, String>> functionList2 = new ArrayList<>(); 

     // ... Add same Function<MyObj, String>s to both lists 

     // I want to assert that functionList1.equals functionList2 
    } 
} 

を私はそれがMyObjの一部FunctionSupplierBiFunctionまたはかもしれないどんなことを確認したいのですがFunction/Supplierなどの呼び出しの結果が同じ入力で同じ値を返す場合、別の値と等しくなります。

したがって、この場合には、Javaは似equalsを使用して2つのリストの値を比較しますのでfunctionList1.get(0).apply(standardInstanceOfMyObj)functionList2.get(0).apply(standardInstanceOfMyObj)に等しいなど

私の質問はどのように私は作るためにFunction<MyObj, String>のような特定のタイプのequalshashcodeを上書きすることができ、あります上記の仕事?

+2

なぜデータ型ではなく、関数のメソッドをオーバーライドしたいのですか? – jrtapsell

+1

まあ、2つの関数は、パラメータ 'a'では同じ値を返しますが、パラメータbでは異なる値を返します。どのようにそれを処理するつもりですか? – Sweeper

+1

なぜこれらの小切手をしたいですか?どんな種類のテスト( "assert"の使用が示唆している)の場合は、おそらくテストフレームワークが提供するメソッドにとどまるべきです。 equals()とhashcode()は、同等の状態ではなく、状態の等価性を意味します。 –

答えて

2

できません。ただし、実際にFunctionを実装しているあなたのクラスに対しては、それらを上書きすることができます。ドメイン空間が無限大である可能性があるので、関数の比較(数学的)は難しいので、Javaは2つの関数が同じであることを知る方法がありません(数字アイデンティティの場合以外はequals()が真となります)。 equals()/hashCode()(例えば、解析された式言語に基づいており、文字列表現を比較できるなど)より細かい関数を用意している場合は、それらの基準を記述する必要がありますあなた自身のクラスで。

関連する問題