2009-08-01 2 views
1

다음은 자바에서 할 수있는 일의 예입니다.인터페이스의 매개 변수화는 하나만 구현 될 수 있습니다. 즉, 어떻게 해결할 수 있습니까?

interface MyInterface<E> { 
    public void doSomething(E foo); 
} 

class MyClass implements MyInterface<ClassA>, MyInterface<ClassB> { 
    public void doSomething(ClassA fooA) { 
    ... 
    } 

    public void doSomething(ClassB fooB) { 
    ... 
    } 
} 

이것을 구현하려고하면 컴파일러에서 MyClass을 한 번만 구현할 수 있다고 알려줍니다. 나는 MyInterface<ClassA>MyInterface<ClassB>에 비해 다른 유형으로 취급되지만 분명히 그렇지 않다고 생각했다. 이것은 매우 유용 할 것 같은데, 그래서 나는 그 오류에 놀랐다.

업데이트 : 지금까지 도움을 주셔서 감사합니다. 지적 된 의견 중 하나로서, 위의 내용은 추상적입니다. 내가 해결하려고하는 문제는 관찰자 클래스가 구현하는 인터페이스를 통해 관찰하는 클래스를 관찰자 클래스가 선언하고 클래스 별 메서드에서 관찰하는 객체의 변경 사항을 처리하는 방식으로 Observer 패턴을 구현하는 것입니다. 이러한 접근법을 사용하는 이점은 인터페이스에서 클래스가 어떤 유형의 객체를 구현하는지 명확하고 컴파일러가 프로그래머에게 관찰 된 클래스의 인스턴스에 대한 변경 처리를 명시 적으로 구현하도록 강제하는 것입니다. 따라서 위의 추상 코드는 실제로 다음과 같을 수 있습니다.

interface IsObserverOf<E> { 
    public void observedDidChange(E foo); 
} 

class MyClass implements IsObserverOf<Database>, IsObserverOf<Spreadsheet> { 
    public void observedDidChange(Database database) { 
    ... 
    } 

    public void observedDidChange(Spreadsheet spreadsheet) { 
    ... 
    } 
} 

여기에서 MyClass는 데이터베이스 개체와 스프레드 시트 개체를 관찰하고 컴파일러는 두 가지 서로 다른 observedDidChange() 메소드를 구현해야합니다.

고마워.

+0

당신이 해결하려고하는 문제에 대한 모든 참조를 제거하고 대답하기 어려운 질문 만 게시했습니다. 문제를 게시 할 수있는 경우 (예 : 두 가지 유형의 CustomersHandlers) 우리는 모두 당신의 문제를 풀려고 노력할 수 있습니다. (당신의 질문에 대답하는 것보다 더피모가 디자인 패턴을 제안하는 것과 같이) 당신은 훨씬 더 좋은 대답을 얻을 수 있습니다. 후자! =) – Tim

답변

5

Type Erasure으로 인해 컴파일 및 실행시 인터페이스의 제네릭 비트 매개 변수가 사라집니다. Java와 관련하여 컴파일 할 때 MyInterface<ClassA>MyInterface<ClassB>은 동일하고 MyInterface이됩니다.

interface Foo<T> { 
    T getSomeObject(); 
} 
: 나는 그들이 제네릭을 구현하는 경우, (메소드 매개 변수에 대한 다른 유형)를 원하는 경우를 처리하기 위해하지만 어떻게 자바 제네릭 매개 변수가 반환 형식에 사용되는 방법을 처리하는 것이 불가능했을 것입니다 가정

문제는 반환 유형 만 차이가있는 메서드를 오버로드 할 수 없으므로 implements MyInterface<ClassA|ClassB>과 같은 작업을 수행 할 수있는 유용성이 심각하게 제한됩니다.

+0

나는 전에도 같은 문제를 겪었다. 내 결론은 Java의 Generic이 짜증 난다는 것이다! Sun은 총알을 조금씩 가지고 있어야하고 우리에게 진짜 Generic을 주어야합니다. –

+0

그들은 소프트웨어/라이브러리 사전 제네릭과의 호환성 문제라고 주장합니다. 진실은 현대의 JVM에서 고대 소프트웨어를 실행할 수 있다는 것은 매우 인상적입니다. 우리는 Mac에서 64 비트 1.6 JVM (예를 들어)에서 완벽하게 잘 작동하는 1.2 이전 Windows JVM (yikes!) 용으로 작성된 복잡한 GUI 소프트웨어를 내부적으로 가지고 있습니다. –

+0

@Journeyman 프로그래머 : 호기심 때문에, OO 언어가'class MyClass는 MyInterface를 구현할 수 있습니까? , MyInterface ...'? –

5

어쩌면 당신은 Visitor Pattern (일명 "이중 발송")을 찾고 있습니다.

+2

+1 : 올바른 접근법 imho – dfa

관련 문제