문제

Java에서 다중 인터페이스 상속을 사용하는 예는 다음과 같습니다. 문제가 있습니다.

왜 문제가 있는지 완전히 알고 있으며 이것이 내 질문의 요점이 아닙니다. 문제는 이름이있는 경우이 특정 다중 인터페이스 상속 애호가의 이름을 지정하는 방법에 관한 것입니다.

예를 들어, C ++에서 여러 구현 상속을 사용할 때 발생하는 모호성을 사용하고 사용할 재정의 메소드를 "다이아몬드 문제"라고 결정할 수 없습니다.

http://en.wikipedia.org/wiki/diamond_problem

이제 다시 한 번, 나는 이것이 동일한 문제가 아니라는 것을 알고 있습니다. 그것은 요점이 아닙니다. 요점은 이전의 경우 이름이 만들어 졌다는 것입니다.

그리고 내가 설명하려는 문제에 대한 이름이 존재하는지 알고 싶습니다.

다음은 하나의 인터페이스가 호환되지 않는 메소드 리턴 유형을 가진 두 개의 다른 인터페이스에서 상속되는 다른 종류의 다중 상속의 예입니다.

interface A {
  void a();
  Integer c();
}

interface B {
  void b();
  Long c();
}

interface MI extends A, B {...}

( 'Extends'키워드를 사용하여 직장에서 다중 인터페이스 상속을 주목하십시오)

당신은 그렇게 할 수 없습니다.

유형 A와 B는 호환되지 않습니다. 둘 다 C ()를 정의하지만 관련없는 반환 유형

그 상황을 설명하기 위해 이름이 만들어 졌습니까?

도움이 되었습니까?

해결책

특정 이름이 있는지 확실하지 않거나 적어도 일반적으로 사용되지 않는 것 같습니다. 클래스 방법에 대한 인터페이스 방법의 암시 적 매핑의 문제 "입니다. 반품 유형 만 다른 과부하를 가질 수 있다면 문제도 없습니다. 따라서 서명/과부하/암시 적 메소드 매핑 문제로 이어집니다.

"Java의 Thinking in Java"온라인 책에는 이름도 없습니다.http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/tij310_001.htm

측면 노트 인 C# 만으로도이 문제를 해결하는 명시 적 인터페이스 구현이 가능합니다.

다른 팁

JLS §6.4.4, 인터페이스 유형의 멤버 이러한 중복 SuperInterface 멤버를 호출합니다 모호한, 컴파일 타임 오류가 필요합니다. 나는와 같은 화려한 것을 바라고 있었다 Beaujolais 효과, Heisenbug, et al. 아마도 두 개의 크로우드?

나는 또한이 문제에 대한 특정 이름을 모른다. 그것이 일어날 때마다 단어가 포함 된 문장으로 설명되었습니다. 반환 유형 비 호환성 어느 시점에서. 당신은 또한 그것을라고 부를 수도 있습니다 맵/세트 양립 값을 설정합니다 이것은 Java 클래스 라이브러리에서 더 두드러지고 성가신 사례 중 하나이므로. 맵이 제거 (개체) 수집과 다른 리턴 유형의 메소드.

public interface Collection<E> extends Iterable<E> {
    boolean remove(Object o);
}
public interface Set<E> extends Collection<E> {
}
public interface Map<K,V> {
    V remove(Object key);
}

인터페이스는 단지 구현 클래스가 구현 해야하는 일련의 인터페이스를 잘 설명하기 때문에 이것을 여러 상속 문제라고 부르기 위해 주저합니다. 다른 인터페이스와의 인터페이스를 확장한다고해서 하위 인터페이스가 슈퍼 interface의 상속을 의미하는 것은 아니지만, 서브 인터페이스는 본질적으로 본질적으로 두 가지에 정의 된 방법의 연결입니다.

세 번째 인터페이스를 사용하여 하위 인터페이스를 확장하고 충돌하는 메소드 선언을 제공하는 경우 동일한 인터페이스에서 동일한 두 가지 충돌 방법을 제공 한 것과 본질적으로 동일합니다.

내가 이것에 대한 이름을 본 적이 있는지 기억이 나지 않습니다. ~ 안에 자바 언어 사양 이것에 대한 이름도 없습니다.

설명하는 문제는 Java뿐만 아니라 .NET에도 존재하지만 간단한 솔루션이 있습니다. .NET 프레임 워크를 사용하면 클래스가 이름이 다른 클래스 멤버를 사용하여 인터페이스 멤버를 구현할 수 있습니다. 따라서 반환 유형에서만 다른 두 개의 인터페이스 멤버를 구현하는 클래스 메소드는 이름이 다른 이름을 가진 인터페이스 멤버를 구현할 수있는 능력을 배제하지는 않습니다.

인터페이스가 충돌하는 멤버와 두 개의 인터페이스를 상속하는 경우, 복합 인터페이스를 구현하는 클래스는 충돌 인터페이스를 직접 상속 한 것처럼 멤버를 구현할 수 있습니다. 결합 된 인터페이스의 소비자는 일반적으로 다른 인터페이스 유형 중 하나에 대한 참조를 변환하지 않고는 구성 요소 인터페이스의 구성원을 사용할 수 없지만 해당 캐스트는 다운 캐스트가 아닌 업 캐스트로 간주됩니다.

.NET에서 구현 된 체계는 잘 작동합니다. 불행히도 Java에서 비슷한 일을 할 방법이 없습니다. 인터페이스가 충돌하는 멤버와 다른 인터페이스를 상속하는 경우 Java가 스 쿼크를 할 것임을 모르지만, 그 시점에서 Squawks의 여부에 관계없이이를 구현할 수있는 클래스를 생산할 수있는 방법은 없을 것입니다.

Java의 인터페이스에 메소드 구현을 가질 수 없기 때문에 이름이 정의되지 않았다고 생각합니다. 따라서 특정 방법에 대한 하나의 구현 만 있으므로 모호성이 발생하지 않기 때문에 문제를 피합니다.

요점을 놓쳤습니까? 아니면 'C'변수에 대해 이야기하고 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top