2011-10-19 4 views
7

Map<V,K>Collection<V> 인터페이스를 한 클래스에 구현했지만 remove(Object) 메소드가 두 인터페이스에서 모두 발생하므로 일식에서 오류가 발생합니다. 반환 유형이 다르면 하나는 boolean이고 다른 하나는 V이지만 문제는 아닌 것 같습니다.Java가 두 인터페이스를 오버라이드하여 메소드 이름 충돌

Java/eclipse에게 실제로 어떤 메소드가 대체되고 있는지 알려주는 방법이 있습니까?

편집 : 모든 값을 구현해야하는 인터페이스가 있는데 getKey() 메서드로 값을 제공하므로 맵에 대한 추가 기능을 작성할 수 있습니다. 그러나 동시에 한 클래스를지도와 컬렉션으로 보이게 할 방법이없는 것 같습니다.

+0

당신이하고자하는 것이 무엇인지 말할 수 있습니다. '지도'는 근본적으로 핵심 가치 사전입니다. '콜렉션 (Collection) '은 단지 많은 것들입니다. 그들은 개념적으로 똑같은 것이 아닙니다. * 키 *가'Collection'으로 접근 할 수있는'Map'을 원한다는 것을 의미합니까? 왜냐하면'keySet()'은이를 수행하기 때문입니다. –

답변

8

아니요, 직접적인 방법은 없습니다.

실제로 동적 바인딩은 반환되는 유형을 제외하고 서명을 사용하므로 Java 컴파일러는 동일한 서명이지만 서로 다른 반환 유형을 가진 동일한 클래스에 대해 두 가지 메소드를 허용 할 수 없습니다. 두 개의 메소드가 동일한 이름과 매개 변수를 가지면 동일한 반환 유형을 가져야합니다. 불행히도 마찬가지입니다.

두 가지 다른 클래스에서 비헤이비어를 분리하고 구성하는 유일한 방법이 있습니다. 어쩌면 Collection<V> asCollection() 또는 이와 비슷한 방법 일 수 있습니다.

+0

다음은 메소드 서명과 관련한 JLS의 설명서입니다. http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.4.2 – rit

1

아니요, 이러한 충돌을 해결할 방법이 없습니다.

적어도 두 인터페이스 중 하나에 대해 상속 대신 compositiondelegation을 사용하거나 클래스의 기능을 두 클래스로 분리 할 수 ​​있습니다. 이는 실제로 구체적인 문제에 달려 있습니다.

+0

Map 클래스에서 Collection 클래스를 확장하고 Collection 클래스에서 remove 메서드 final을 설정하면 Map 클래스에서 오류가 발생합니다. 또는 작품을 어떻게 사용해야합니까? –

+0

"Map class extends Collection"을 만들면 상속을 사용하게됩니다. 당신이하려는 일은 근본적으로 몇 가지 커스텀 차이가있는 Map 일 뿐이라면 Map 만 확장하도록 만들고, 일부 기능을 위해 Collection이 내부적으로 필요하다면 Collection을 private 변수로 선언 할 수 있습니다. 필요한 경우 위임을 사용하여 필요한 메소드private 변수의 비슷한 메서드에서 호출을 전달하는 메서드를 정의합니다. – stivlo

+0

감사합니다.하지만 클래스를 위임 할 때 실제 컬렉션의 모양이 느슨합니다. 애플리케이션이 toCollection() 메소드를 호출 할 필요없이이 구현을 사용하는 것이 간단해야한다. 그러나 이것은 불가능한 것처럼 보인다. –

1

Map에는 이미 키 집합 인 keySet()이 있습니다. 왜 컬렉션도 필요합니까? 그렇다면 asMapasCollecton과 같은 두 가지 방법으로 다른 유형을 반환합니다.

+0

사용자 정의 add() 메소드를 작성합니다. 지도. –

+0

그리고? .. 당신은 항상'yourObject.asMap(). add (.. custom ..)'를 할 수 있습니다. – kan

0

상속 대신 구성이 필요할 수 있습니다. 불행히도 Java는 언어 수준의 지원이 없습니다. 즉, 할 수 있지만 불필요하게 힘드는 것입니다.

0

디자인을 재고해야합니다. 근본적으로지도는 컬렉션과 다릅니다. Collection.add() 메소드에 대해 생각해보십시오. 지도에 값이없는 키나 키가없는 객체를 추가하는 것은 의미가 있습니까?

가장 좋은 방법은 응용 프로그램에 따라 다르지만 맵을 구현하는 것이지만 컬렉션이 필요할 때는 키, 값 또는 키 값 쌍을 가져 오는 방법 중 하나를 사용하십시오.

+0

제 편집을보세요. 값에서 키를 가져 오는 방법을 제공하는 인터페이스가 있습니다. 나는 내가하고 싶은 것을 알고있다. 유일한 질문은 어떻게 :-) –

+0

'add'가 그 예이다. 내 의견이있다. – JeremyP