Вложенные дженерики в 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, и я бы сообщил об этом как таковом.