2010-08-11 2 views
2

와 오류를 컴파일 I 수 (중요한 부분 감소) 다음과 같은 오류 메시지가 내 클래스 컴파일있을 때 : 자바 인터페이스

reference to keySet is ambiguous, both method keySet() in 
java.util.SortedMap<E,capture#614 of ?> and method keySet() in 
test.ImmutableMap<E,capture#614 of ?> match 
    return map.keySet().iterator(); 
      ^

map

유형 ImmutableSortedMap<E, ?>이며 불변 클래스 외모의 정의를 like :

public interface ImmutableMap<K, V> 
    extends Map<K, V> { 
    @Override 
    public ImmutableSet<K> keySet(); 
    ... 
} 
public interface ImmutableSortedMap<K, V> 
    extends ImmutableMap<K, V>, SortedMap<K, V> { 
    ... 
} 
public interface ImmutableSet<E> 
    extends Set<E> { 
    ... 
} 

ANT 스크립트를 사용하여 컴파일 할 때나 수동으로 컴파일 할 때 오류가 표시되지만 Eclipse에서는 그렇지 않습니다. sun 1.6.0icedtea6 1.8.1으로 시도해 보았습니다.

내가 누락되었거나 컴파일을 허용하기 위해 이클립스 어딘가에 설정 될 수있는 옵션이 있습니까? 문제는, 당장은 이클립스에서 테스트를 실행할 수 있지만 이클립스 밖에서는 프로젝트를 컴파일 할 수 없다는 것입니다.


편집 : 일부 컴파일러 버전 같은 다중 상속에 문제가있는 것 같다 대답

. 해결 방법은 공통 수퍼 인터페이스를 가지고 있고 메서드를 재정의하는 다른 인터페이스를 상속 한 하위 클래스에서 메서드를 한 번 더 재정의하는 것입니다.

public interface ImmutableSortedMap<K, V> 
    extends ImmutableMap<K, V>, SortedMap<K, V> { 
    // adding this method solves the problem 
    @Override 
    public ImmutableSet<K> keySet(); 
} 

그런데 이것은 다이아 몬 문제입니다.

답변

0

ImmutableMap 및 SortedMap 인터페이스는 모두 "keySet()"이라는 메서드를 가지고 있으므로 컴파일러는 호출 할 수있는 메서드를 찾을 수 없습니다. 귀하의 인터페이스에서 메서드의 이름을 변경;)

+0

메서드가 일치하면 문제가되지 않습니다. –

+0

이름을 변경하는 대신 하위 클래스의 메서드를 다시 선언하면 문제가 해결됩니다. – Kru

1

그것은 내게 보이는, ImmutableMap#keySet 잘못된 반환 유형이 있습니다. Set<K> 또는 ImmutableSet<K>이어야합니다.
또는 한 쌍의 집합을 반환하려면 대신 Map#entrySet을 무시하십시오.

인터레이스 A가 인터페이스 B와 C를 확장하고 B와 C가 동일한 서명 (doIt(String param1, int param2))을 갖는 경우 아무 문제가 없습니다. 그러나 반환 유형은 B#doItC#doIt이어야합니다. B#doIt이 String을 반환하고 C#doIt이 int를 반환하면 하나의 클래스에서이 두 메서드를 결합 할 수 없습니다.

아, 왜 이클립스에서 컴파일되는지 모르겠다.

+0

entrySet과 동일한 오류가 발생했으며이 메서드의 제네릭 형식을 잘못 입력했습니다. (나는 문제를 바로 잡았습니다.) – Kru

+0

@Chris 그렇다면 제공 한 샘플에는 아무런 문제가 없습니다 (단, jdk의 표준 불변 래퍼를 사용할 수 있음). keySet의 구현 방법을 보여줄 수 있습니까? (거기에 선언) –

+0

내가 편집 한 질문 및 그것은 명시 적으로 ImmutableSortedMap에있는 메서드의 서명을 얘기해야 컴파일러와 문제가있는 것 같습니다. 일부 수정 된 요소가있는 원래 구조 인 새로운 불변 ​​구조를 만드는 데 드는 비용이 전체 구조의 복사본을 필요로하므로 래퍼를 사용하지 않습니다. 구현은 여기에 계시되지 않고 많은 다른 기능을 사용합니다 ... 너무 커서 여기에 넣으십시오. – Kru