Наследование с помощью дженериков и перегрузка метода
У меня есть класс со следующим методом:
public abstract class TypedMessage<T>{
public TypedMessage<T> setBody(byte[] body) {
this.body = body;
return this;
}
В подклассе TypedMessage
Я хочу перегрузить этот метод. Поэтому я делаю следующее:
public class ThriftMessage<T extends TBase> extends TypedMessage<T>{
public TypedMessage<T> setBody(T body) {
byte[] data = ThriftMessageUtils.messageBodyToByteArray(body);
this.body = data;
return this;
}
Обратите внимание на ограничение на T
родовой. Что оно должно распространяться TBase
, Это все хорошо компилируется. Теперь, когда я иду использовать его в классе, объявленном так:
public abstract class CQSTask<CQSEvent extends TBase>{
protected void sendCQS(CQSEvent cqsEvent) throws Exception{
TypedMessage<CQSEvent> message =
new ThriftMessage<CQSEvent>(getCQSEventClass())
.setBody(cqsEvent) //<---Compile error
setBody()
выдает ошибку компиляции. Он пытается сослаться на:
public TypedMessage<T> setBody(byte[] body)
версия метода в TypedMessage
а не перегруженная версия в ThriftMessage
,
Это сбивает с толку, потому что в моем классе, где я объявляю общий параметр CQSEvent
У меня есть ограничение, что оно распространяется TBase
также. Может кто-нибудь помочь мне понять, почему он не пытается ссылаться на перегруженную версию?
Обновить:
Вот сообщение об ошибке
error: incompatible types: CQSEvent cannot be converted to byte[]
.setBody(cqsEvent);
^
где CQSEvent является переменной типа: CQSEvent расширяет TBase, объявленный в классе CQSTask