Java中的嵌套泛型

时间:2014-05-01 21:10:29

标签: java generics

请允许我请求解释。

在方法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>();
  }
}

当类和方法嵌套在另一个类Container

中时,我仍然可以从方法doit()到达类In<T>的成员
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>();
    }
  }
}

然而,制作A泛型,如

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.Container.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>();
    }
  }
}

代码编译。

并编译以下代码,其中Container不再是通用的,但类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 个答案:

答案 0 :(得分:2)

作为类的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>()

会导致错误

  

&#34;成员类型A.Container.In必须参数化,因为它是   使用参数化类型&#34;

进行限定

Inner成员类型是In的嵌套类,它是Container的嵌套类,它是A的嵌套类。它们都与声明类中声明的类型参数没有任何关系。

这似乎是你的IDE中的一个错误,我会报告它。