2014-03-24 3 views
1

this question까지 추적 할 수 있지만 자급 자족하도록 노력하겠습니다.일반 매개 변수와 호환되는 인터페이스 확장을 어떻게 만들 수 있습니까?

한다고 가정 내가 가진 여러 가지 이유로 구현 클래스 나타내는 제네릭 형식 매개 변수가 Animal라는 인터페이스 : 나는 또한 하위 인터페이스를

public interface Animal<A extends Animal<A>> 

, Dinosaur, 같은 방식으로 작동합니다 :

:

public interface Dinosaur<D extends Dinosaur<D>> extends Animal<D> 

는 지금은 Animal를 구현하는 클래스 Lizard

Dinosaur를 구현하는 서브 클래스, Trex :

public class Trex extends Lizard implements Dinosaur<Trex> 

이 네 개의 선언이 이제 오류가 발생합니다. Trex 클래스는 Animal 인터페이스를 두 번 구현하지만 형식 매개 변수가 다르므로 Lizard을 확장하고 Animal<Lizard> 인터페이스를 구현하며 Dinosaur<Trex>을 구현하므로 Animal<Trex>을 구현합니다.

Animal<Trex>TrexLizard의 서브 클래스 임에도 불구하고, Animal<Lizard>의 서브 인터페이스 아니다, 그래서 우리는 컴파일러 오류가 발생합니다.

나는 와일드 카드를 사용하는 방법이있을 것이라고 확신하지만, 그것이 무엇인지 알아낼 수는 없습니다. 여기

이 같은 오류 얻을 컴파일 할 수 있습니다 뭔가 :

public class InterfaceTest 
{ 
    private interface Animal<A extends Animal<A>> {} 

    private interface Dinosaur<D extends Dinosaur<D>> extends Animal<D> {} 

    private class Lizard implements Animal<Lizard> {} 

    private class Trex extends Lizard implements Dinosaur<Trex> {} 
} 

답변

2

This is because the class Trex implements the interface Animal twice, but with different type parameters

그래를,이 사건이며,이 직접 주위에 방법이 없습니다 - 제네릭 삭제를 사용하여 구현되어 있기 때문에 기술적 한계입니다 . 다른 일반 매개 변수를 사용하여 둘 이상의 클래스에서 동일한 인터페이스를 구현할 수 없습니다. 제네릭 형식이 지워지면 두 가지 인터페이스를 동일하게 확장하여 결국 서로 다른 제네릭 형식을 사용하는 메서드를 구별 할 수 없으므로 런타임에서 실행할 메서드를 결정할 방법이 없습니다.

특정 유스 케이스의 경우 다른 유형 매개 변수로 동일한 인터페이스를 구현할 필요가 없음을 의미하는 해결 방법이있을 수 있지만 더 자세한 정보가 없으면 그 정보를 말할 수 없습니다.

EDIT : 링크 된 질문을 보면 클래스에서 선언하지 않고 반환 값을이 방식으로 지정하는 다른 대답 (허용하지 않은 답변)을 사용하여이 문제를 해결할 수 있습니다.

public <T extends JNumber> T add(T addend); 

이해야 당신이 당신의 클래스와 인터페이스에 제네릭 형식 매개 변수를 선언 할 필요가 없습니다, 다음 따라서이 문제가 없어야 의미한다.

+1

예 - 다른 답변을 사용하면 정확하게 제가 생각한 해결 방법이었습니다. 도와 주셔서 대단히 감사합니다. –

+0

@ Donkey_2009 괜찮습니다. – berry120

관련 문제