Наследование с помощью дженериков и перегрузка метода

У меня есть класс со следующим методом:

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

0 ответов

Другие вопросы по тегам