为什么内部类的对象不能在泛型中生成

时间:2014-06-09 06:50:54

标签: java generics inner-classes

我有以下代码

class OuterClass<T>{

class Innerclass{
int k;
}

public static void main(String argv[]){

OuterClass<Integer> out =new OuterClass<>();
Innerclass in; // errors out
}

}

但是对于没有类似下面代码的泛型的类,我可以为内部类创建对象。

class OuterClass{

class Innerclass{
int k;
}

public static void main(String argv[]){

OuterClass out =new OuterClass();
Innerclass in; // No error

}

}

为什么我不能创建内部类的对象虽然在我的第一个例子中内部类中没有使用泛型?请解释一下。

1 个答案:

答案 0 :(得分:2)

您的main方法属于OuterClass,并且在那里是静态的。由于InnerClass不是静态类,而是隐式依赖于泛型类型T(泛型类型在内部类中可用,即使您的示例未使用它),也无法引用它来自静态方法。

换句话说,由于InnerClass取决于通用类型,因此您无法将其打破并失去&#34;来自OuterClass并在其之外使用它。

如果您的内部类不依赖于泛型类型,则可以将其设置为静态。但是,在这种情况下,您可能需要考虑将其提取到单独的类中而不是嵌套类:

class OuterClass<T> {
    static class InnerClass {
        int k;
    }

    public static void main( String argv[] ) {
        InnerClass inner = new InnerClass();
    }
}

如果泛型对内部类很重要,您可以通过指定它来告诉编译器哪个泛型推断外部类(注意outerinner的泛型类型必须匹配)或者使用OuterClass.InnerClass,在这种情况下,编译器将使用原始类型:

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

请注意,您需要一个类型为outer的封闭实例OuterClass<T>才能实例化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();
    }
}

赢得&#39;吨