У меня есть следующее определение:Java родовое "захват # п-о" компиляции ошибка
public interface MessageResponseHandler<T extends MessageBody> {
public void responsed(Message<T> msg);
}
public class DeviceClientHelper {
public MessageResponseHandler<? extends MessageBody> messageHandler;
setHandler(MessageResponseHandler<? extends MessageBody> h){
this.messageHandler = h;
}
public someMethod(Object message){
Message<? extends MessageBody> msg = (Message<? extends MessageBody>) message;
if (this.messageHandler != null) {
this.messageHandler.responsed(msg);
}
}
}
Я не мог понять, почему в методе SomeMethod(), призывание
this.messageHandler.responsed(msg);
дал бы мне ошибку проводного компилятора в eclipse. что-то вроде:
the method responsed(Message<capture#3-of ? extends MessageBody>) in
the type MessageResponseHandler<capture#3-of ? extends MessageBody> is
not applicable for the arguments (Message<capture#4-of ? extends
MessageBody>)
Что такое «catpure» означает в сообщении об ошибке в любом случае?
Это [тип стирания] (http://docs.oracle.com/javase/tutorial/java/generics/erasure.html) в лучшем виде. – Finbarr
ну, я вроде знаю, почему сейчас. данный MessageResponseHandler расширяет MessageBody> messageHandler, он должен быть определенным типом MessageBody, но не общим. Но как я могу обойти это? тип будет отличаться каждый раз. – Wudong
@Finbarr это не имеет никакого отношения к стиранию. Типы просто необоснованны. –