Add ImmutableSet support to SetBindingRequestFulfillment

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=160912106
diff --git a/java/dagger/internal/codegen/SimpleInvocationRequestFulfillment.java b/java/dagger/internal/codegen/SimpleInvocationRequestFulfillment.java
index 0e43011..94e19bd 100644
--- a/java/dagger/internal/codegen/SimpleInvocationRequestFulfillment.java
+++ b/java/dagger/internal/codegen/SimpleInvocationRequestFulfillment.java
@@ -34,6 +34,17 @@
 
   abstract CodeBlock getSimpleInvocation(DependencyRequest request, ClassName requestingClass);
 
+  /**
+   * Java 7 type inference is not as strong as in Java 8, and therefore some generated code must
+   * make type parameters for {@link Futures#immediateFuture(Object)} explicit.
+   *
+   * <p>For example, {@code javac7} cannot detect that Futures.immediateFuture(ImmutableSet.of(T))}
+   * can safely be assigned to {@code ListenableFuture<Set<T>>}.
+   */
+  protected CodeBlock explicitTypeParameter(ClassName requestingClass) {
+    return CodeBlock.of("");
+  }
+
   @Override
   final CodeBlock getSnippetForDependencyRequest(
       DependencyRequest request, ClassName requestingClass) {
@@ -41,8 +52,11 @@
       case INSTANCE:
         return getSimpleInvocation(request, requestingClass);
       case FUTURE:
-        return CodeBlock.of(
-            "$T.immediateFuture($L)", Futures.class, getSimpleInvocation(request, requestingClass));
+        return CodeBlock.builder()
+            .add("$T.", Futures.class)
+            .add(explicitTypeParameter(requestingClass))
+            .add("immediateFuture($L)", getSimpleInvocation(request, requestingClass))
+            .build();
       default:
         return delegate.getSnippetForDependencyRequest(request, requestingClass);
     }