您的 main 方法属于 OuterClass 并且在那里是静态的。由于InnerClass 不是静态类,而是隐式依赖于泛型类型T(泛型类型在内部类中可用,即使您的示例没有使用它),您不能从静态方法中引用它。
换句话说,由于InnerClass 依赖于泛型类型,因此您不能将它从OuterClass 中“丢失”并在其外部使用。
如果您的内部类不依赖于泛型类型,您可以将其设为静态。但是,在这种情况下,您可能需要考虑将其提取到单独的类中,而不是嵌套类:
class OuterClass<T> {
static class InnerClass {
int k;
}
public static void main( String argv[] ) {
InnerClass inner = new InnerClass();
}
}
如果泛型对内部类很重要,您可以通过指定它(注意outer 和inner 的泛型类型必须匹配)或使用@ 来告诉编译器为外部类推断哪个泛型987654330@ 在这种情况下编译器将使用原始类型:
class OuterClass<T> {
class InnerClass {
int k;
}
public static void main( String argv[] ) {
OuterClass<String> outer = new OuterClass<String>();
// works and has the "correct" generic type
OuterClass<String>.InnerClass inner1 = outer.new InnerClass();
// works, but uses the raw type
OuterClass.InnerClass inner2 = outer.new InnerClass();
}
}
请注意,您需要一个OuterClass<T> 类型的封闭实例outer 才能实例化InnerClass(因为该类不是静态的,它属于OuterClass 的一个实例)。
这也适用于没有泛型的例子:你需要一个封闭的实例来实例化内部类,所以
class OuterClass {
class InnerClass {
int k;
}
public static void main( String argv[] ) {
OuterClass outer = new OuterClass();
InnerClass in = outer.new InnerClass();
}
}
将工作,而
class OuterClass {
class InnerClass {
int k;
}
public static void main( String argv[] ) {
OuterClass outer = new OuterClass();
InnerClass in = new InnerClass();
}
}
不会。