2011-11-03 6 views
19

즉, 다음의 "주기적 종속성"이 왜 불가능합니까?Java가 내부 인터페이스의 상속을 금지하는 이유는 무엇입니까?

public class Something implements Behavior { 
    public interface Behavior { 
     // ... 
    } 
} 

인터페이스는 외부 클래스를 참조하지 않으므로 허용되어야합니다. 그러나 컴파일러는 클래스 외부의 인터페이스를 정의하도록 강요하고 있습니다. 이 동작에 대한 논리적 인 설명이 있습니까?

+0

클래스 로더와 같은 사운드는 먼저 클래스를 정의해야하는 인터페이스를 알기 위해 먼저 클래스를 읽어야 만합니다 ... 클래스 로딩에 대한 세부 사항을 알지 못하지만 매우 명확하게 보입니다. –

+2

@donneo : 컴파일러가 "주기적 종속성"에 대해 불평하기 때문에 내부 클래스에 정의 된 유형을 이미 알고 있다고 상상해보십시오. 그것은 나에게 임의의 제한처럼 보인다. –

+0

@PhilipK : 어떤 컴파일러를 사용하고 있습니까? Mine (Oracle JDK 6 및 7)은 "심볼을 찾을 수 없습니다"라는 불만을 제기합니다. 그 외에도 중첩 된 인터페이스는 기술적 인 방법으로 외부 클래스에 실제로 의존하지 않으므로 * 합법적 일 수 있습니다. –

답변

11

관련 규칙 :

http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.1.4

(가) 확장하거나 어느 수퍼이나 슈퍼로 C 절 구현에서 T가 언급되는 경우 C는 직접 형 T에 따라 클래스 또는 수퍼 클래스 또는 수퍼 인터페이스 이름의 한정자로 사용됩니다.

http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#9.1.3

T가 언급되는이 슈퍼로 또는 슈퍼 이름 내에 규정으로 I 하나의 절을 확장하는 경우 I 직접 형 T에 의존하는 인터페이스.

따라서 A extends|implements B.C 경우는 CB 모두에 의존한다. 그런 다음 Spec은 순환 종속성을 금지합니다.

B을 종속성에 포함시키는 동기가 불분명합니다. 언급했듯이 B.C이 최상위 레벨 C2으로 승격되면 형식 시스템과 관련하여 별다른 차이가 없으므로 A extends C2은 괜찮습니까? A extends B.C이 아닌 이유는 무엇입니까?부여 된 중첩 형식 B.C에는 B의 콘텐츠에 대한 일부 액세스 권한이 있지만 A extends B.C을 괴롭히는 사양의 항목을 찾을 수 없습니다.

유일한 문제는 C이 내부 클래스 인 경우입니다. "enclosing instance"의 순환 종속성이 있으므로 B=A, A extends A.C을 금지해야한다고 가정합니다. 아마 외부 클래스를 상속하는 클래스에서 금지하는 것이 진정한 동기입니다. 실제 규칙은 더 간단하고 비 내부 클래스의 경우에도 어쨌든 좋은 의미를 갖기 때문에보다 일반화되어 있습니다.

10

당신이 컴파일러라고 상상해보십시오.

우리는 당신이 뭔가를 만들라고 말하고 있습니다. 이 클래스는 동작을 구현합니다 ... 하지만 뭔가 아직 등록되지 않았기 때문에 동작이 존재하지 않습니다 ...

이해가 되니?

상자에 물건이 들어있는 상자를 참조하십시오. 행동은 상자에 포함되어 있습니다. 그러나 뭔가 존재하지 않습니다.

+3

질문이 C++에 관한 것이면 이것은 유효한 대답이 될 것입니다. –

+1

예,하지만 Behavior는 인터페이스이므로 Something 생성에 의존하지 않습니다. –

+0

예, 인터페이스가 Something의 일부이기 때문입니다. 행동을 참조하기 전에 뭔가 존재해야하지만, 행동을 참조해야하는 것이 있습니다. –

0

언어 사양이 금지되어 있다는 단순한 사실만으로 충분합니다. 내가 생각할 수

몇 가지 이유 :

  • 이 유용하지 않을 것입니다.

  • 어떤 이유에서든이 기능을 사용하려는 경우 더 나은 옵션이있을 것입니다.

  • 하위 클래스는 기본 클래스를 확장해야하므로 기본 자식을 기본 자식으로 선언해야하는 이유는 무엇입니까?

  • 내부 클래스를 확장하는 별도의 클래스가 있으면 역 직감적입니다. 사양에

+0

콜백 인터페이스가 필요한 경우 다른 클래스로 전달하는 것이 유용 할 수 있습니다. – ismailarilik

관련 문제