Возвращаемый тип шаблона подстановки Java для абстрактного метода - PullRequest
1 голос
/ 29 марта 2019

В документации Java для подстановочных знаков говорится, что они могут использоваться в качестве возвращаемых типов, но, как правило, это не очень хорошая идея. Это все еще верно, если подстановочный знак используется в качестве возвращаемого типа для абстрактного метода, но класс, который реализует этот метод, возвращает конкретный тип? Если нет, то как лучше всего справиться с такой ситуацией. Рассмотрим пример ниже. В этом случае Entity может быть смоделировано после ответа JSON REST, где во втором случае результатом является просто список строк. Лучше использовать List<Object> в качестве типа возврата или что-то еще целиком?

public abstract class AbstractClient {
    public abstract List<?> listEntities();
}

public class ConcreteClient {
    @Override
    public List<Entity> listEntities();
}

public class ConcreteClient2 {
    @Override
    public List<String> listEntities();
}

1 Ответ

2 голосов
/ 29 марта 2019

В таком случае лучше использовать дженерики правильно, а не подстановочные знаки.Используйте параметр типа и расширьте абстрактный класс соответствующим аргументом для параметра типа:

public abstract class AbstractClient<T> {
    public abstract List<T> listEntities();
}

public class ConcreteClient extends AbstractClient<Entity> {
    @Override
    public List<Entity> listEntities();
}

public class ConcreteClient2 extends AbstractClient<String> {
    @Override
    public List<String> listEntities();
}
...