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

javac accepts method invocation with actuals that are not subtypes of the formal

    XMLWordPrintable

Details

    • x86
    • linux, solaris_8

    Description

      FULL PRODUCT VERSION :
      java version "1.6.0"
      Java(TM) SE Runtime Environment (build 1.6.0-b105)
      Java HotSpot(TM) Client VM (build 1.6.0-b105, mixed mode, sharing)


      A DESCRIPTION OF THE PROBLEM :
      javac rejects the following apparently incorrect snippet of code

        <T> void sort(T[] a, Comparator<? super T> c) { return null; }
        Enum[] ea = null;
        Comparator<Enum<?>> comp = null;
        { sort(ea, comp); }

      I tried the following to see which way the subtype relations run between Enum and Enum<?>

        List<? extends Enum<?>> t1 = null;
        List<? extends Enum> t2 = null;

        // { t1 = t2; } // error here indicates Enum is not a subtype of Enum<?>
        { t2 = t1; } // allowed, showing Enum<?> is a subtype of Enum

      javac appears to infer Enum in the call to sort(...), but that should lead to an error based on the subtyping relations. javac agrees, rejecting

        { this.<Enum>sort(ea, comp); }

      The fact that javac does not check the call after inferring the type argument is a bug.

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      Compile the enclosed test case, which should fail

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      Bound.java:13: <T>sort(T[],java.util.Comparator<? super T>) in Bound cannot be applied to (java.lang.Enum[],java.util.Comparator<java.lang.Enum<?>>)
        { this.<Enum>sort(ea, comp); } // yet javac accepts this code, inferring T=Enum
          ^
      1 error

      ACTUAL -
      compile without error

      ERROR MESSAGES/STACK TRACES THAT OCCUR :
      error messages missing

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      import java.util.*;
      class Bound {
        List<? extends Enum<?>> t1 = null;
        List<? extends Enum> t2 = null;

        // { t1 = t2; } // error here indicates Enum is not a subtype of Enum<?>
        { t2 = t1; }

        <T> T sort(T[] a, Comparator<? super T> c) { return null; }
        Enum[] ea = null;
        Comparator<Enum<?>> comp = null;

        { this.sort(ea, comp); } // yet javac accepts this code, inferring T=Enum
                                 // suggesting Enum<?> is a supertype of Enum.
      }

      ---------- END SOURCE ----------

      Attachments

        Issue Links

          Activity

            People

              mcimadamore Maurizio Cimadamore
              ndcosta Nelson Dcosta (Inactive)
              Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved:
                Imported:
                Indexed: