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

javac behavior and reported bug questionable

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Duplicate
    • Icon: P4 P4
    • None
    • 6u29
    • tools
    • x86
    • windows_xp

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

      ADDITIONAL OS VERSION INFORMATION :
      Microsoft Windows XP [Version 5.1.2600]

      A DESCRIPTION OF THE PROBLEM :

      Got an interface to force clone() to be implemented (ICloneable).
      This interface is used in other interfaces (NoCloneError_[1-4] and
      CloneError) as type-parameter for these interfaces.

      Compiling CloneError.java with javac I get the following error:

      ----------------------------------------------------------------------------
        strange\CloneError.java:13: clone() in java.lang.Object cannot implement
        clone() in strange.ICloneable; attempting to assign weaker access
        privileges; was public
        public interface CloneError<T extends CloneableItf & AnyItf> {
                                    ^
      ----------------------------------------------------------------------------

      ... but only if it is compiled with pre-existing .class-files of the other used
      interfaces (see below "javac-behavior").

      Besides the behavior of javac, also the question is if this is an error, as
      ICloneable requires Object clone() to be public-ly implemented for any given
      class T.

      javac-behavior:

        compiling all the classes at once, without any .class-file existing before
        (command: javac strange\*.java) compiles everything without errors.

        compiling the base interfaces (ICloneable, CloneableItf, AnyItf) before and
        then only CloneError.java, gives the above mentioned error
        
        special case: NoCloneError_4.java:
          compiles ok, if class CCloneable.java is compiled before, else above error



      REGRESSION. Last worked in version 6u29

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      see description


      ERROR MESSAGES/STACK TRACES THAT OCCUR :
        strange\CloneError.java:13: clone() in java.lang.Object cannot implement
        clone() in strange.ICloneable; attempting to assign weaker access
        privileges; was public
        public interface CloneError<T extends CloneableItf & AnyItf> {
                                    ^


      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      package strange;

      /*
       * using this interface as substitue for "CloneableItf & AnyItf" in
       * type-parameters prevents the clone()-error (see NoCloneError1.java)
       */
      public interface AnyCloneable
        extends CloneableItf, AnyItf {
        /*empty*/
      }

      package strange;

      public interface AnyItf {
        String any();
      }

      package strange;

      public class CCloneable
        implements ICloneable {
        @Override
        public Object clone() throws CloneNotSupportedException {
          return this;
        }
      }

      package strange;

      public interface CloneableItf
        extends ICloneable {
        String hello();
      }

      package strange;

      /*
       * compile-error:
       *
       * ----------------------------------------------------------------------------
       * strange\CloneError.java:13: clone() in java.lang.Object cannot implement
       * clone() in strange.ICloneable; attempting to assign weaker access
       * privileges; was public
       * public interface CloneError<T extends CloneableItf & AnyItf> {
       * ^
       * ----------------------------------------------------------------------------
       *
       * (mis-)behavior of javac in jdk 6 (update 29):
       *
       * 1) first remove all class-files, then just run compile
       * "javac strange\CloneError.java" - which won't give you any errors
       *
       * 2) then run compile "javac strange\CloneError.java" again and you will
       * get the above mentioned "clone()-error"
       *
       * javac of jdk 5 behaves similar to jdk 6
       *
       * javac of jdk 7 always produces the same error
       *
       */
      public interface CloneError<T extends CloneableItf & AnyItf> {
        void dummy();
      }

      package strange;

      public interface ICloneable {
        public Object clone() throws CloneNotSupportedException;
      }

      package strange;

      public interface NoCloneError_1<T extends ICloneable> {
        void dummy();
      }

      package strange;

      public interface NoCloneError_2<T extends CloneableItf> {
        void dummy();
      }

      package strange;

      public interface NoCloneError_3<T extends AnyCloneable> {
        void dummy();
      }

      package strange;

      /*
       * javac 6:
       * compiles ok if CCloneable.class exists before, else clone()-error
       */
      public interface NoCloneError_4<T extends CCloneable & CloneableItf & AnyItf> {
        void dummy();
      }

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

      CUSTOMER SUBMITTED WORKAROUND :
      refactoring code

            dlsmith Dan Smith
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: