2014-06-09 2 views
2

에서 생성 할 수없는 이유 내부 클래스의 객체가 제네릭

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

코드의 어느 버전도 실제로 내부 클래스의 인스턴스를 만들지 않습니다. 내부 클래스 유형의 변수 만 선언합니다. – user2357112

답변

2

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를 사용하여이 경우 컴파일러는 원시 유형 사용 :이 유형의 둘러싸는 예를 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(); 
    } 
} 

하지 않습니다.

+0

이것은 generics가없는 버전이 컴파일되는 이유를 설명하지 않습니다. – user2357112

+1

@ user2357112 클래스를 인스턴스화하지 않기 때문에 컴파일 만합니다. InnerClass in = new InnerClass() '는 범용 인스턴스가없는 버전에서도 실패합니다. 나는 내 대답을 편집했다. –

+1

답변의 새 버전이 더 설명합니다. OuterClass가 raw 타입을 사용하기 때문에 OuterClass가 generic인지 여부에 관계없이 'OuterClass.InnerClass inner;'를 추가하고 싶습니다. InnerClass inner;는 매개 변수화 된 형식을 사용하려고 시도하고 제공 할 형식 매개 변수가 없습니다. – user2357112

관련 문제