Вложенные дженерики в Java

позвольте мне, пожалуйста, попросить объяснения.

внутри метода doit () я могу интанцировать общий вложенный класс In<T>

public class A {

  public static class In<T> {
  }

  public static <X> void doit() {
    new In<X>();
  }
}

Я могу, конечно, также связаться с любыми членами класса In<T>

public class A {

  public static class In<T> {
    public static class Inner<U> {
    }
  }

  public static <X> void doit() {
    new In.Inner<X>();
  }
}

Я все еще могу связаться с членами класса In<T> из метода doit (), когда и класс, и метод вложены внутри другого контейнера класса

public class A {

  public static class Container {

    public static class In<T> {

      public static class Inner<U> {
      }
    }

    public static <X> void doit() {
      new In.Inner<X>();
    }
  }
}

однако, делая общий, как в

public class A<V> {

  public static class Container {

    public static class In<T> {

      public static class Inner<U> {
      }
    }

    public static <X> void doit() {
      new In.Inner<X>();
    }
  }
}

компилятор исключает ошибку: "тип члена A. контейнер.In должен быть параметризован, так как он квалифицируется параметризованным типом"

не могли бы вы, пожалуйста, дайте мне объяснение?

обратите внимание, что в предыдущем коде классы и метод статичны.

обратите внимание также, что создание универсального контейнера класса, как в

public class A<V> {

  public static class Container<Z> {

    public static class In<T> {

      public static class Inner<U> {
      }
    }

    public static <X> void doit() {
      new In.Inner<X>();
    }
  }
}

код компилируется.

и компилирует также следующий код, где Контейнер больше не является универсальным, но вызов конструктора класса Inner<U> теперь более квалифицированный Container.In.Inner<X>()

public class A<V> {

  public static class Container {

    public static class In<T> {

      public static class Inner<U> {
      }
    }

    public static <X> void doit() {
      new Container.In.Inner<X>();
    }
  }
}

спасибо.

1 ответов


вложенный класс, являясь static член класса, не зависит от параметра типа (экземпляр) класса. Таким образом, в вашем примере

class A<V> {

    public static class Container {

        public static class In<T> {

            public static class Inner<U> {
            }
        }

        public static <X> void doit() {
            new In.Inner<X>(); // compilation error
        }
    }
}

нет абсолютно никакой причины, что выражение создания экземпляра класса

new In.Inner<X>()

вызовет ошибку

"тип-членов A.Container.In должен быть параметризован, так как он квалифицированный с параметризованным типом"

The Inner тип элемента является вложенным класс In, который является вложенным класс Container, что вложенный класс A. Ни один из них не имеет никакого отношения к параметру тип, объявленный в классе объявления.

это похоже на ошибку в вашей IDE, и я бы сообщил об этом как таковом.