### Question:
LeftBoundFunction implements Function<A, T> { @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (!(obj instanceof LeftBoundFunction<?, ?>)) { return false; } LeftBoundFunction<?, ?> that = (LeftBoundFunction<?, ?>) obj; return this.function.equals(that.function) && (null == this.param ? null == that.param : this.param.equals(that.param)); } @SuppressWarnings("unchecked") <L> LeftBoundFunction(BinaryFunction<? super L, ? super A, ? extends T> function, L arg); T evaluate(A obj); @Override boolean equals(Object obj); @Override int hashCode(); @Override String toString(); static LeftBoundFunction<R, T> bind(
            BinaryFunction<? super L, ? super R, ? extends T> function, L arg);  }### Answer:
@Test public void testEquals() throws Exception { Function<Object, Object> f = new LeftBoundFunction<Object, Object>(RightIdentity.FUNCTION,"xyzzy"); assertEquals(f,f); assertObjectsAreEqual(f,new LeftBoundFunction<Object, Object>(RightIdentity.FUNCTION,"xyzzy")); assertObjectsAreNotEqual(f,Constant.of("xyzzy")); assertObjectsAreNotEqual(f,new LeftBoundFunction<Object, Object>(LeftIdentity.FUNCTION,"xyzzy")); assertObjectsAreNotEqual(f,new LeftBoundFunction<Object, Object>(RightIdentity.FUNCTION,"bar")); assertObjectsAreNotEqual(f,new LeftBoundFunction<Object, Object>(RightIdentity.FUNCTION,null)); assertObjectsAreEqual(new LeftBoundFunction<Object, Object>(RightIdentity.FUNCTION, null),new LeftBoundFunction<Object, Object>(RightIdentity.FUNCTION, null)); assertTrue(!f.equals(null)); }