gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:07:09 25 4
gpt4 key购买 nike

我有以下代码

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

}

}

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

最佳答案

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

换句话说,由于 InnerClass 依赖于通用类型,因此您不能将其从 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();
}
}

不会。

关于java - 为什么不能在泛型中生成内部类的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24115064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com