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

Unrelated defaults inheritance error for type variables

    XMLWordPrintable

    Details

    • Subcomponent:
    • Introduced In Version:
      8
    • CPU:
      x86
    • OS:
      generic

      Description

      FULL PRODUCT VERSION :
      java version "1.8.0_65"
      Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
      Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)

      ADDITIONAL OS VERSION INFORMATION :
      Darwin MacBook-Pro.local 15.0.0 Darwin Kernel Version 15.0.0: Sat Sep 19 15:53:46 PDT 2015; root:xnu-3247.10.11~1/RELEASE_X86_64 x86_64

      A DESCRIPTION OF THE PROBLEM :
      Consider two interfaces (in package "a")

      interface I1 {
          default void x() {}
      }

      interface I2 {
          default void x() {}
      }

      Consider also such class with type variable "T":

      class A<T extends I1&I2> {
         
      }

      Trying to compile it causes:

      Main.java:8: error: class INT#1 inherits unrelated defaults for x() from types I1 and I2
      class A<T extends I1&I2> {
              ^
        where INT#1 is an intersection type:
          INT#1 extends Object,I1,I2
      1 error

      Why I can not define such type variable?
      Why java cares about unrelated defaults in this case?
      What such type variable could "break"?

      Just for clarification. I can create several classes of the form:

      class A1 implements I1, I2 {
          public void x() { };
      }

      class A2 implements I1, I2 {
          public void x() { };
      }
      and so on. Why I can not declare special kind of type variable for such group of classes?

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      Compile source code

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      Type variables should not care about unrelated defaults inheritance. Code should be compiled.
      ACTUAL -
      It doesn't compile.

      ERROR MESSAGES/STACK TRACES THAT OCCUR :
      Main.java:8: error: class INT#1 inherits unrelated defaults for x() from types I1 and I2
      class A<T extends I1&I2> {
              ^
        where INT#1 is an intersection type:
          INT#1 extends Object,I1,I2
      1 error

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      package a;

      public class Main {
      }

      class A<T extends I1&I2> {
      }

      interface I1 {
          default void x() {
          }
      }

      interface I2 {
         default void x() {
         }
      }

      class A12 implements I1, I2 {
          public void x() { };
      }
      ---------- END SOURCE ----------

        Attachments

          Issue Links

            Activity

              People

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

                Dates

                Created:
                Updated:
                Resolved: