Как переопределить дочерние методы расширенного класса - PullRequest
1 голос
/ 11 мая 2019

Я хотел бы расширить базовую сущность до совместимости с документом DynamoDB, но я не знаю, как расширить дочернюю сущность сущности.Вот код:

@Data
@Accessors(chain = true)
@ApiModel
public class Question {

    @NotNull
    @ApiModelProperty(value = "UUID", required = true)
    private UUID id;

    @NotBlank
    private String name;

    @ApiModelProperty(value = "List of answers")
    private List<Answer> answers = Collections.emptyList();

}

@Data
@Accessors(chain = true)
@ParametersAreNonnullByDefault
public class Answer {

    @NotNull
    @ApiModelProperty(value = "Question key", required = true)
    private UUID questionKey;

    @NotBlank
    @ApiModelProperty(value = "Answer in string format", required = true)
    private String value;
}

Вот расширенный динамо-документ с ответом:

@DynamoDBTable(tableName = "question")
public class QuestionDocument extends Question {

    @DynamoDBHashKey
    @DynamoDBAutoGeneratedKey
    @Override
    public UUID getId() {
        return super.getId();
    }

    @DynamoDBAttribute
    @Override
    public Long getName() {
        return super.getName();
    }

    @DynamoDBAttribute
    @Override
    // Here is the problem, I don't know how to properly override answers, because this method expect Answer output.
    public Set<AnswerDocument> getAnswers() {
        return super.getAnswers();
    }
}

@DynamoDBDocument
@NoArgsConstructor
public class AnswerDocument extends Answer {

    @DynamoDBAttribute
    @Override
    public Long getValue() {
        return super.getValue();
    }
}

Проблема в том, что я не знаю, как правильно переопределить расширенный метод getAnswers () QuestionDocumentчтобы вернуть AnswerDocument также расширенным.

Просьба указать мне правильный путь, как сделать это с наследованием, как это показано в примере выше.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 11 мая 2019

Из документов Java:

"Возможность подкласса переопределять метод позволяет классу наследовать от суперкласса, поведение которого" достаточно близко ", а затем изменять поведение по мере необходимости.Метод переопределения имеет то же имя, число и тип параметров, и тип возвращаемого значения, что и метод, который он переопределяет. Метод переопределения также может возвращать подтип типа, возвращаемого переопределенным методом . Этот подтип называетсяковариантный тип возврата. "

Так как AnswerDocument расширяет Answer, возвращая тип AnswerDocument в методе, который переопределяет метод с типом возврата Answer, это нормально.

Однако я не думаю, что вы хотите просто позвонить super здесь, потому что он даст вам список Answer, и это не похоже на то поведение, которое вы хотите здесь.Поэтому, если вам нужно поведение от super, получите его список Answer, сделайте ваши преобразования, а затем верните список AnswerDocument.

@DynamoDBAttribute
@Override
public List<AnswerDocument> getAnswers() {
    List<Answer> answerlist = super.getAnswers();
    // transform them to AnswerDocument
    return answerDocumentList ;
}

В этом примере предполагается, что ваши AnswerDocuments сначала присутствуют как Ответыи затем преобразуются.Если QuestionDocument не содержит ответов, то метод super не будет вам полезен вообще, и вам придется писать весь код самостоятельно, но вы все равно можете сделать это методом, переопределяющим исходный getAnswers(),но с типом возврата AnswerDocument.

0 голосов
/ 11 мая 2019

Вам необходимо изменить тип возвращаемого значения на Collection, так как List и Set относятся к другой иерархии.
Я внес некоторые изменения, проверьте приведенный ниже фрагмент и сообщите, соответствует ли он вашим требованиям.

Примечание. Для краткости я удалил другие аннотации.

Родительский класс:

class Question {

    private UUID id;

    private Long name;

    private List<Answer> answers = Collections.emptyList();

    // Change in the return type
    public Collection<Answer> getAnswers() {
        return answers;
    }

    public void setAnswers(List<Answer> answers) {
        this.answers = answers;
    }
}

Детский класс:

public class QuestionDocument extends Question {

    @Override
    public Collection<AnswerDocument> getAnswers() {
        return super.getAnswers();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...