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

ParameterizedType.getOwnerType() documentation is incomplete about null result

XMLWordPrintable

    • Icon: CSR CSR
    • Resolution: Withdrawn
    • Icon: P4 P4
    • 24
    • core-libs
    • None
    • minimal
    • Clarification to API specification involves minimal risk.
    • Java API
    • SE

      Summary

      Update ParameterizedType.getOwnerType() and AnnotatedType.getOwnerType() docs to indicate they can return null, and top-level or local class or interface and anonymous class are (but not necessarily the only) scenarios where they do.

      Problem

      1. ParameterizedType.getOwnerType() may return null, and it does so for top level classes or interfaces, anonymous classes, and local classes or interfaces. However, the specification appears like null can only be returned for top-level classes or interfaces.
      2. AnnotatedParameterizedType.getOwnerType() note describes an impossible scenario where it represents a primitive type or void.

      Solution

      1. Specify that ParameterizedType.getOwnerType may return null, and list those classes or interfaces as scenarios that it always return null.
      2. Clarify those scenarios to be "top-level or local class or interface or anonymous class".
      3. Remove the impossible primitive or void scenario in AnnotatedParameterizedType.getOwnerType()'s note.

      Specification

      diff --git a/src/java.base/share/classes/java/lang/reflect/AnnotatedParameterizedType.java b/src/java.base/share/classes/java/lang/reflect/AnnotatedParameterizedType.java
      index 1c62d3d131c..f6bd9d5dc3f 100644
      --- a/src/java.base/share/classes/java/lang/reflect/AnnotatedParameterizedType.java
      +++ b/src/java.base/share/classes/java/lang/reflect/AnnotatedParameterizedType.java
      @@ -48,16 +48,13 @@ public interface AnnotatedParameterizedType extends AnnotatedType {
           AnnotatedType[] getAnnotatedActualTypeArguments();
      
           /**
      -     * Returns the potentially annotated type that this type is a member of, if
      -     * this type represents a nested type. For example, if this type is
      +     * {@return the potentially annotated type that this type is a member of, if
      +     * this type represents a nested type, or {@code null}} For example, if this type is
            * {@code @TA O<T>.I<S>}, return a representation of {@code @TA O<T>}.
            *
            * <p>Returns {@code null} if this {@code AnnotatedType} represents a
      -     *     top-level class or interface, or a local or anonymous class, or
      -     *     a primitive type, or void.
      +     *     top-level or local class or interface or an anonymous class.
            *
      -     * @return an {@code AnnotatedType} object representing the potentially
      -     *     annotated type that this type is a member of, or {@code null}
            * @throws TypeNotPresentException if the owner type
            *     refers to a non-existent class or interface declaration
            * @throws MalformedParameterizedTypeException if the owner type
      diff --git a/src/java.base/share/classes/java/lang/reflect/AnnotatedType.java b/src/java.base/share/classes/java/lang/reflect/AnnotatedType.java
      index 9525d3638fd..bc563b731b6 100644
      --- a/src/java.base/share/classes/java/lang/reflect/AnnotatedType.java
      +++ b/src/java.base/share/classes/java/lang/reflect/AnnotatedType.java
      @@ -50,12 +50,12 @@
       public interface AnnotatedType extends AnnotatedElement {
      
           /**
      -     * Returns the potentially annotated type that this type is a member of, if
      -     * this type represents a nested type. For example, if this type is
      +     * {@return the potentially annotated type that this type is a member of, if
      +     * this type represents a nested type, or {@code null}} For example, if this type is
            * {@code @TA O<T>.I<S>}, return a representation of {@code @TA O<T>}.
            *
            * <p>Returns {@code null} if this {@code AnnotatedType} represents a
      -     *     top-level class or interface, or a local or anonymous class, or
      +     *     top-level or local class or interface or an anonymous class, or
            *     a primitive type, or void.
            *
            * <p>Returns {@code null} if this {@code AnnotatedType} is an instance of
      @@ -66,8 +66,6 @@ public interface AnnotatedType extends AnnotatedElement {
            * This default implementation returns {@code null} and performs no other
            * action.
            *
      -     * @return an {@code AnnotatedType} object representing the potentially
      -     *     annotated type that this type is a member of, or {@code null}
            * @throws TypeNotPresentException if the owner type
            *     refers to a non-existent class or interface declaration
            * @throws MalformedParameterizedTypeException if the owner type
      diff --git a/src/java.base/share/classes/java/lang/reflect/ParameterizedType.java b/src/java.base/share/classes/java/lang/reflect/ParameterizedType.java
      index 99016623a3e..0e42fe9079b 100644
      --- a/src/java.base/share/classes/java/lang/reflect/ParameterizedType.java
      +++ b/src/java.base/share/classes/java/lang/reflect/ParameterizedType.java
      @@ -76,15 +76,14 @@ public interface ParameterizedType extends Type {
           Type getRawType();
      
           /**
      -     * Returns a {@code Type} object representing the type that this type
      -     * is a member of.  For example, if this type is {@code O<T>.I<S>},
      +     * {@return a {@code Type} object representing the type that this type
      +     * is a member of, or {@code null} if this type is not a member of
      +     * another type}  For example, if this type is {@code O<T>.I<S>},
            * return a representation of {@code O<T>}.
            *
      -     * <p>If this type is a top-level type, {@code null} is returned.
      +     * <p>If this type is a top-level or local class or interface or
      +     * an anonymous class, {@code null} is returned.
            *
      -     * @return a {@code Type} object representing the type that
      -     *     this type is a member of. If this type is a top-level type,
      -     *     {@code null} is returned
            * @throws TypeNotPresentException if the owner type
            *     refers to a non-existent class or interface declaration
            * @throws MalformedParameterizedTypeException if the owner type

            liach Chen Liang
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved: