2017-12-24 1 views
0

두 번째 유형 (T, M) 첫 번째 컴파일러는 두 번째 유형을 인식하지 않습니다. 어떤 생각을 잘못하고 있니?타입을 java 제네릭을 사용하여 유추 할 수 없습니다.

Error:(164, 17) java: name clash: consumeBatch(java.lang.String,int,io.vertx.core.Handler<java.util.List<MessageResponse>>) in EventQueueSQS and consumeBatch(java.lang.String,int,io.vertx.core.Handler<java.util.List<MessageResponse<M>>>) in EventQueue have the same erasure, yet neither overrides the other 

컴파일러 힘이 나를 : 나는 합병증 오류가

public class EventQueueSQS 
     implements EventQueue<SendMessageResultImpl, MessageImpl> { 

    @Override 
    public SendMessageResponse send(String address, String message, String eventId) {..} 

    @Override 
    public void consumeBatch(String address, int numOfConsumerThreads, Handler<MessageResponse> callback) { 
    } 

    .. 
} 

consumeBatch 재정의 방법 : IMPL에

public interface EventQueue<T, M> { 

    SendMessageResponse<T> send(String address, String message, String eventId); 

    void consumeBatch(String address, int numOfConsumersPerQueue, Handler<MessageResponse<M>> callback); 

    .. 
} 

:

public class SendMessageResponse<T> { 

    private T result; 
} 

public class MessageResponse<M> { 

    private M message; 
} 

인터페이스는 이런 식으로 정의된다 방법에 impl을 작성하십시오 :

public void consumeBatch(String address, int numOfConsumersPerQueue, Handler<MessageResponse<Message>> callback) { 

왜? 나는 그것을 클래스 수준에서 선언했다

어떤 생각?

아마도 제네릭이있는 클래스를 보유하고있는 Handler를 사용하는 것이 문제일까요? 경계 경우 자신의 바운드 구현 유형으로 변환하는 등 M 바이트 코드를 입력 매개 변수로 컴파일 또는 객체 경우 언제 제네릭 첫 번째 작품으로, 다른 하나 나던

+0

당신이 https://stackoverflow.com/questions/14002965/java-name-clash-have-the-same-erasure-neither-hides-the-other 봤어? –

+0

이 질문이 내 질문과 어떻게 관련이 있는지 모르겠습니까? iam이 제네릭과 인터페이스를 구현하기 때문입니다. 그리고 컴파일러는 두 번째 방법과 같이하지 않습니다 – rayman

답변

0

에 대하여> SendMessageResponse 또는 처리기를 사용하여 사이의 DIFF를 찾을 수 없습니다 무한대 this을 참조하십시오. 클래스 EventQueueSQS의 메소드에 구현 유형을 제공하지 않으므로 인터페이스 메소드와 클래스 메소드가 모두 Handler<MessageResponse<Object>>으로 컴파일되어 충돌 오류가 발생합니다. 따라서 MessageImpl 클래스 메서드에서 형식 매개 변수 M에 대해 구현 된 형식을 제공 - 바인딩해야합니다.

당신은 여전히 ​​메소드의 인수 안에 있지만 매개 변수로 제공 할 필요가 어디 EventQueueSQS 중 인터페이스에서 Handler<MessageResponse<M>>에서 <M>을 제거하거나 클래스는 EventQueueSQS<T,M> implements EventQueue<T,M> 같은 파라미터 만들 클래스의 실제 구현 유형을 제공하기 위해 싶지 않는 경우 M을 입력하면 EventQueueSQS<SendMessageResultImpl,MessageImpl>과 같은 인스턴스를 만들 수 있습니다. 당신의 방법에서

+0

어떻게 해결하겠습니까? 내가 impl을 제공 했어. 내 EventQueueSQS 봐, 사용자 MessageImpl – rayman

+0

로 왜 SendMessageResponse 어떤 오류 던질? 나는 그것을 같은 방식으로 처리했다. – rayman

+0

내가 무슨 일이 일어 났을 때 당신이 인터페이스를 구현할 때 MessageImpl을 전달한 다음 consumeBatch 함수를 오버라이드하면 MessageIml이 인터페이스의 서명 때문에 MessageResponse에 유형으로 전달 될 것으로 예상된다는 것이다. 두 번째 유형 M도 그 시점에서 예상됩니다.) 컴파일 될 때 예상되는 Handler > 대신 Handler >이 표시됩니다. 이것은 서명을 깨뜨리지 만, SendMessageResponse의 경우 인터페이스와 클래스 모두에서 SendMessageResponse 으로 컴파일됩니다. – ichantz

0

당신은 인수 유형 설정 :

Handler<MessageResponse> callback 

을하지만이

Handler<MessageResponse<Object>> callback 

과 동일하며이 MessageImpl 당신의 타입 M과 충돌한다. 다이아몬드 연산자를 지원하는 Java 버전을 사용하는 경우 컴파일러에서 제안한 것과 동일한 Handler<MessageResponse<>> callback을 쓸 수 있습니다. 사용자 인터페이스 정의에 따르면

public class EventQueueSQS 
    implements EventQueue<SendMessageResultImpl, MessageImpl> { 

    @Override 
    public SendMessageResponse send(String address, String message, String eventId) {..} 

    @Override 
    public void consumeBatch(
      String address, 
      int numOfConsumerThreads, 
      Handler<MessageResponse> callback) { 
    } 

    .. 
} 

이 당신의 consumeBatch 방법의 서명에 대한 적절한 일치되지 않습니다 :

+0

iam 어디 처리기 > 인터페이스 또는 구현 클래스 (EventQueueSQS) – rayman

+0

사용해야하는지 잘 모르지만 SendMessageResponse 사용하여 내 다른 방법을보십시오. 그것은 완벽하게 편집됩니다. diff는 무엇입니까? – rayman

0

는 여기에 귀하의 구체적인 구현입니다. 당신이 필요합니다

public void consumeBatch(
      String address, 
      int numOfConsumerThreads, 
      Handler<MessageResponse<MessageImpl>> callback) { 
    } 
+0

왜 처리기로 구체적인 impl을 설정해야합니까? > - 이미 M 유형이 정의 된 클래스 수준에서 설정했습니다. 왜 SendMessageResponse와 동일한 상황이 아닌가? T 타입을 언급하지 않고 오버라이드 메소드에서 SendMessageResponse를 유지할 수있다. – rayman

+0

구체 구현의 핸들러 유형은 사용자가 정의한 방법대로 정의해야한다. 너무 좋은 것입니다. Generics는 Java 9에서 컴파일 타임에만 나타나는 현상입니다. 제한없는 제네릭 형식은 런타임에 Object로 지워집니다. 컴파일러가 프로그램의 유형 안전성을 보장 할 수있는 유일한 방법은 명시적인 메소드가 유형 선언을 통해 해석되는 유형 만 승인 할 수 있다고 확신하는 경우입니다. 여기서'M'은 무제한 타입이기 때문에'Handler > 만 지정할 수 있고 컴파일러는 타입 안전성을 보장합니다. – scottb

+0

그래서이 경우 왜 클래스 수준에서이 클래스를 묶었습니까? 왜 SendMessageResponse를 내 콘크리트 impl에 T로 바인딩 할 필요가 없습니까? – rayman

관련 문제