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

Compiler allows class type parameters inside super()'s static context

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Duplicate
    • Icon: P4 P4
    • 22
    • None
    • tools
    • None
    • Reproduced with:

      • javac 1.8.0_312
      • javac 11.0.16.1
      • javac 19.0.1
      • javac 21-internal (jdk-21+7-124-g9fe8e823f3a)
    • generic
    • generic

      javac accepts the following program:

      {noformat}
      import java.util.concurrent.atomic.*;

      public class TypeParamStaticContext<T> extends AtomicReference<T> {
          public TypeParamStaticContext(Object obj) {
              super((T)obj);
          }
          public <U extends T> TypeParamStaticContext(Object obj, int x) {
              super((U)obj);
          }
      }
      {noformat}

      However, the references to {{T}} and {{U}} are invalid because the inside of a {{super()}} call is a static context.

      Relevant JLS sections:

      §8.8.7.1:

      {quote}
      An explicit constructor invocation statement introduces a static context (§8.1.3), which limits the use of constructs that refer to the current object. Notably, the keywords this and super are prohibited in a static context (§15.8.3, §15.11.2), as are unqualified references to instance variables, instance methods, and type parameters of lexically enclosing declarations (§6.5.5.1, §6.5.6.1, §15.12.3).
      {quote}

      §6.5.5.1:

      {quote}
      If a type name consists of a single Identifier, then the identifier must occur in the scope of exactly one declaration of a class, interface, or type parameter with this name (§6.3), or a compile-time error occurs.

      If the declaration denotes a type parameter of a generic class or interface C (§8.1.2, §9.1.2), then both of the following must be true, or a compile-time error occurs:

      * The type name does not occur in a static context (§8.1.3)

      * If the type name appears in a nested class or interface declaration of C, then the immediately enclosing class or interface declaration of the type name is an inner class of C.
      {quote}

            acobbs Archie Cobbs
            acobbs Archie Cobbs
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved: