2012-05-04 1 views
4

문제 :인터페이스를 확장하는 방법은 자바에서 다른 일반 매개 변수를 사용하여 동일하게 확장 할 수 있습니까?

기본 인터페이스 :

IBase 

후손 :

InterfaceA extends IBase<Interface1> 

InterfaceB extends IBase<Interface2> 

내가 시도 :

InterfaceC extends InterfaceA, InterfaceB 

나는 컴파일 나타난 오류 :

The interface IBase cannot be implemented more than once with different arguments 

해결 방법이 있습니까? 감사합니다. .

+0

내가 수표를 가지고 - 하지만 솔루션은 클래스를위한 클러스터입니다. 어떻게 인터페이스를 만드는지 모르겠습니다. – user710818

답변

4

이것은 가능하지 않으며 최소한 Java로는 될 수 없습니다. 다음과 같은 시나리오의 생각한다

interface Base<K> { 
    K get(); 
} 

interface A extends Base<String> { 
    String get(); 
} 

interface B extends Base<Integer> { 
    Integer get(); 
} 

interface AB extends A, B { 
    ?? 
} 

당신이 할 수 있다면, AB를 구현하려고 갈 때, 어떤 유형의 get() 메소드의 반환 것. Java에서 클래스의 두 메소드는 동일한 이름/인수를 가질 수는 없지만 다른 리턴 유형을 가질 수는 없습니다. 따라서이 작업은 금지됩니다. 당신은 실제로 당신이 자바가이를 허용해야 얻을 것 것과 유사한 일부 기능이 필요한 경우

, 나는 다음과 같은 제안 :

abstract class C { 
    A a; 
    B b; 
    String aGet() { 
     return a.get(); 
    } 

    Integer bGet() { 
     return b.get(); 
    } 
} 

을 또는 제네릭을 유지하기 위해 :

abstract class C<K, T> { 
    Base<K> a; 
    Base<T> b; 
    K getA() { 
     return a.get(); 
    } 

    T getB() { 
     return b.get(); 
    } 
} 
3

Generics는 기본적으로 컴파일 시간 만 검사하므로 InterfaceA와 InterfaceB는 동일합니다.

당신이 제안하는 것에 대한 일반적인 해결책은 생각해 내기가 어렵습니다. 정확한 상황을 더 자세히 지정해야 할 것입니다. 하지만 두 클래스를 구현하려면 그 클래스가 정말로 필요합니까, 왜 두 개의 다른 클래스가 아닌가요? 어쩌면 중첩 된 클래스 또는 익명의 내부 클래스일까요?

+0

예, 클래스를 InterfaceA 및/또는 InterfaceB로 사용해야합니다. – user710818

+0

일반 유형을 지정하지 않고 Object로 한 번 구현할 수 있으며 이전 방식의 이유는 무엇입니까? (캐스팅과 경고 무시) –

+0

오래된 인터페이스/클래스. 많은 코드에 따라 다릅니다. – user710818

관련 문제