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
의 제네릭 형식이 일치해야합니다) 또는 OuterClass.InnerClass
를 사용하여이 경우 컴파일러는 원시 유형 사용 :이 유형의 둘러싸는 예를 outer
필요
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>
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();
}
}
하지 않습니다.
코드의 어느 버전도 실제로 내부 클래스의 인스턴스를 만들지 않습니다. 내부 클래스 유형의 변수 만 선언합니다. – user2357112