2009-11-20 3 views
0

나는 다음있어 :자바 제네릭/초록/innerclass 구문 질문

public abstract class Foo<T>{ 
    //contents of Foo // 
     ... 
    public class Bar<Q> extends Foo<T>{ 
     //contents of Foo.Bar // 
     ... 
    } 
} 

나중에, 다른 클래스와 자바 파일에, 나는 사용하여, 위의 내부 바 클래스의 인스턴스를 생성하는 것을 시도하고있다 슈퍼 타입으로서의 외부 추상 클래스. 더 복잡하게하기 위해, 새로운 클래스는 자신의 generic을가집니다. 다음은 작동하지 않습니다.

public class SomeOtherClass<A>{ 
    private Foo<A> x; 

    public SomeOtherClass(){ 
     x = Foo<A>.Bar<A>(); 
    } 
} 

하지만 작동하지 않습니다. 그리고 내가 시도한 다른 모든 콤보도 마찬가지입니다. 그렇다면 어떻게하면 x을 인스턴스화할까요? Foo의 매개 변수를 제거하지 않고도 완료 할 수 있습니까? 나는 Foo의 매개 변수를 제거하고 싶지 않습니다. 추상적 인 메서드는 서명에 일반 매개 변수가 있기 때문입니다.

+0

나는 최고의 대답을 받아 들일 곳이 있다는 것을 깨닫지 못했습니다. 죄송 해요! – Jay

+0

가능할 때마다 내부 클래스 대신 정적 중첩 클래스를 사용하는 것을 잊지 말고 이상한 혼란스러운 문제 대부분이 사라지는 것을 지켜보십시오. –

답변

3

내부 클래스의 인스턴스를 가져 오려면 먼저 외부 클래스의 인스턴스가 필요합니다. 귀하의 예제에서 Foo은 추상적이므로 외부 클래스를 인스턴스화 할 수 없습니다. 따라서 내부 클래스를 인스턴스화 할 수도 없습니다. 당신이 더러운 트릭을 사용할 수 있습니다 (더 추상적 인 방법이 없기로 구현)

public class SomeOtherClass<A>{ 
    private Foo<A> x; 
    public SomeOtherClass() { 
     //create anonymous extension of the abstract outer class 
     //for a real abstract class this would mean you have to 
     //implement all methods which are declared abstract 
     x = new Foo<A>(){}; 
     x = x.new Bar<A>(); 
    } 
} 

를 그래서 실제로 클래스 구조가 맞다면 당신이 innerclass에 액세스해야하는 경우, 자신에게 물어해야합니다 귀하의 예를 들어

(Foo)의 클래스 (Bar)가 포함 된 클래스를 실제로 필요로하지 않습니다.

+0

감사합니다. 이것은 영리한 트릭입니다. 나는 내 속에서 게으르다 고 생각한다. – Jay

-1

막대는 Foo의 정적이 아닌 내부 클래스입니다. 즉, Bar 인스턴스를 생성하기 위해 Foo의 인스턴스가 필요합니다. Foo의 인스턴스를 필요로하지 않으려면 Bar를 정적 내부 클래스로 만들어야합니다.

+1

Foo가 추상적이어서 인스턴스를 생성 할 수 없습니다. – jitter

+0

고마워요! 이것이 내가 생각한 것입니다. – Jay

+1

이상한 것은이 답변이 옳다는 것입니다. 완전히 다른 것을하고있는 코드 스 니펫 (snippet)까지입니다. –

0

탐사를위한 질문 외에도 Bar의 내포 동기는 Foo 안에 있습니까? 이것은 거의 enumEnum이 작동하는 것처럼 보이지만 대부분의 기이 한 것을 숨기기위한 비하인드 컴파일러 마술이 없습니다.

Foo이 불완전한 경우, 포함 된 패키지 (클래스가 public으로 선언되지 않은 경우)보다 더 멀리 떨어져 있지 않은 경우에도 멀리서 확장되어야합니다. 불완전한 껍질 안에 중첩되는 확장 기능은 잠재적 인 클라이언트를 혼란시킬뿐입니다.

실제 문제 도메인에 대한 자세한 내용을 공유하면 해결 방법을 모델링하는 방법에 대한 구체적인 답글을 많이 불러올 것입니다.