Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8037474

Failure to detect conflicting upper bounds in inference

    XMLWordPrintable

    Details

      Description

      Test:

      ---
      import java.util.List;

      public class GLBConflict {

          interface I<S> {}
          interface J<S> extends I<S> {}
          interface J2<S> extends I<S> {}
          interface K extends I<String> {}

          <T> T upper2(List<? super T> l1, List<? super T> l2) { return null; }

          void test(List<I<String>> i, List<J<Integer>> j, List<J2<String>> j2, List<K> k) {
              upper2(i, j); // expected: error; actual: error
              upper2(j, j2); // expected: error; actual: ok
              upper2(j, k); // expected: error; actual: ok
          }

      }
      ---

      All three invocations of 'upper2' should fail, due to this clause (JLS 8 18.3):

      "If two bounds have the form α <: S and α <: T, and if for some generic class or interface, G, there exists a supertype (4.10) of S of the form G<S1, ..., Sn> and a supertype of T of the form G<T1, ..., Tn>, then for all i, 1 ≤ i ≤ n, if Si and Ti are types (not wildcards), the constraint ⟨Si = Ti⟩ is implied."

      Under '-source 7' and previous, there is not a clear specification for an error, but all three invocations otherwise produce a malformed intersection, which javac makes some effort to prevent. If the first one is an error (javac claims it is), the other two should be errors, too.

        Attachments

          Issue Links

            Activity

              People

              Assignee:
              vromero Vicente Arturo Romero Zaldivar
              Reporter:
              dlsmith Dan Smith
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

                Dates

                Created:
                Updated:
                Resolved: