繁体   English   中英

Java中的嵌套泛型

[英]Nested Generics in 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>();
  }
}

当类和方法嵌套在另一个类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必须参数化,因为它使用参数化类型限定”

请你帮我解释一下吗?

请注意,在以前的代码中,类和方法是静态的。

另请注意,将通用类设为Container,如

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

谢谢。

嵌套类(作为类的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 ,因为它使用参数化类型进行限定”

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM