### Question:
BinaryCompositeBinaryFunction implements BinaryFunction<L, R, T> { @Override public final boolean equals(Object obj) { if (obj == this) { return true; } if (!(obj instanceof BinaryCompositeBinaryFunction<?, ?, ?>)) { return false; } BinaryCompositeBinaryFunction<?, ?, ?> that = (BinaryCompositeBinaryFunction<?, ?, ?>) obj; return this.helper.f.equals(that.helper.f) && this.helper.g.equals(that.helper.g) && this.helper.h.equals(that.helper.h); } <G, H> BinaryCompositeBinaryFunction(BinaryFunction<? super G, ? super H, ? extends T> f,
            BinaryFunction<? super L, ? super R, ? extends G> g, BinaryFunction<? super L, ? super R, ? extends H> h); final T evaluate(L left, R right); @Override final boolean equals(Object obj); @Override int hashCode(); @Override String toString();  }### Answer:
@Test public void testEquals() throws Exception { BinaryFunction<Object, Object, Object> f = new BinaryCompositeBinaryFunction<Object, Object, Object>( LeftIdentity.FUNCTION, Constant.of("left"), Constant.of("right")); assertEquals(f,f); assertObjectsAreEqual(f,new BinaryCompositeBinaryFunction<Object, Object, Object>( LeftIdentity.FUNCTION, Constant.of("left"), Constant.of("right"))); assertObjectsAreNotEqual(f,new BinaryCompositeBinaryFunction<Object, Object, Object>( RightIdentity.FUNCTION, Constant.of("left"), Constant.of("right"))); assertObjectsAreNotEqual(f,new BinaryCompositeBinaryFunction<Object, Object, Object>( RightIdentity.FUNCTION, RightIdentity.FUNCTION, Constant.of("right"))); assertObjectsAreNotEqual(f,new BinaryCompositeBinaryFunction<Object, Object, Object>( LeftIdentity.FUNCTION, Constant.of("left"), RightIdentity.FUNCTION)); assertObjectsAreNotEqual(f,new BinaryCompositeBinaryFunction<Object, Object, Object>( LeftIdentity.FUNCTION, Constant.of("rigth"), Constant.of("right"))); assertTrue(!f.equals(null)); assertTrue(!f.equals((BinaryCompositeBinaryFunction<?,?,?>)null)); }