Обобщения Java в интерфейсе - PullRequest
3 голосов
/ 20 февраля 2012

У меня возникла проблема с дженериками в Java, и я не могу найти в Интернете решение или пример того, кто использует дженерики аналогичным образом.У меня есть набор методов, которые находятся в той же структуре запроса / ответа.Например, пользователь заполняет поля в объекте Request, передает объект вспомогательному методу, и им возвращается объект Response.Все мои объекты запроса происходят из общего суперкласса Request (и аналогично, объекты Response из суперкласса Response).Я хотел бы, чтобы мои вспомогательные классы также имели согласованную структуру, поэтому я использовал интерфейс.Вот некоторый код для иллюстрации ...

Суперкласс запроса:

public class SuperRequest {
    // ...
}

Пример подкласса запроса:

public class SubRequest extends SuperRequest {
    // ...
}

Суперкласс ответа:

public class SuperResponse {
    // ...
}

Пример подкласса ответа:

public class SubResponse extends SuperResponse{
    // ...
}

Интерфейс:

public interface SomeInterface {
    public <T extends SuperRequest, U extends SuperResponse> U someMethod(T request);
}

Как видно из интерфейса, я хочу передать объект, который является дочерним по отношению к SuperRequest и я хочу вернуть объект, который является потомком SuperResponse.Вот моя реализация:

public class SomeImplementation implements SomeInterface {

    @Override
    public SubResponse someMethod(SubRequest request) {
        return null;
    }
}

В Eclipse я получаю ошибки компиляции, потому что компилятор говорит мне, что у меня есть не реализованные методы, и запись @Override "не переопределяет метод супертипа".

Может кто-нибудь помочь мне здесь?Мой синтаксис неверен или мое понимание дженериков немного неверно?Любая помощь с благодарностью!

Ответы [ 3 ]

7 голосов
/ 20 февраля 2012

Попробуйте изменить интерфейс и реализацию на:

interface SomeInterface<T extends SuperRequest, U extends SuperResponse> {
    public U someMethod(T request);
}

class SomeImplementation implements SomeInterface<SubRequest, SubResponse> {

    @Override
    public SubResponse someMethod(SubRequest request) {
        return null;
    }
}
1 голос
/ 20 февраля 2012

Вы должны также объявить типы при реализации интерфейса.Попробуйте это:

public class SomeImplementation implements SomeInterface<SubRequest,SubResponse> {

    @Override
    public SubResponse someMethod(SubRequest request) {
        return null;
    }
}
1 голос
/ 20 февраля 2012

В нынешнем виде реализация SomeInterface должна реализовывать параметризованный метод, т. Е .:

.
public <T extends SuperRequest, U extends SuperResponse> U someMethod(T request);

Невозможно выбрать определенный подкласс для замены T и U.

Сам интерфейс должен быть общим SomeInterface<T extends SuperRequest, U extends SuperResponse>, и тогда подкласс может выбирать конкретные реализации для T и U.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...