Java Generic: Как расширить универсальный класс другого универсального класса - PullRequest
0 голосов
/ 09 мая 2019

Во-первых, у меня есть простой шаблон, ничего особенного:

public abstract class ListOfK<K> {
   private List<K> insides = new ArrayList<>(); 
}

Далее я создаю интерфейс службы, используя шаблон

public abstract interface SomeService<K extends ListOfK<K>> {
    int calculateSomething (K input);
    int calculateAnother (ListOfK<K> list);
}

Пока все хорошо сабстракция.

Теперь давайте перейдем к реализации

public class ListOfString extends ListOfK<String> {

}

и реализации SomeService:

public class SomeServiceImpl extends SomeService<String> {
  @Override
  public int calculateSomething(String input) {
    return 0;  // TODO impl
  }

  @Override
  public int calculateAnother(ListOfK listOfK) {
    return 0;  // TODO impl
  }
}

Каким-то образом, когда SomeServiceImpl расширяется SomeService<String>, этоотмечается Type parameter java.lang.String is not within its bound; should extend ListOfK<String>

Что я должен вводить как реализацию SomeService, чтобы она не выдавала ошибку?Или я ошибаюсь с SomeService?Я просто хочу, чтобы класс ввода был другим классом, использующим Generic.

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

Ответы [ 2 ]

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

Ключевым моментом здесь является то, что K в контексте класса ListOfK отличается от типа K в контексте класса SomeService.Фактически, в вашем определении SomeService вы говорите, что K само по себе должно быть ListOfK, что, как я подозреваю, является вашей проблемой.

  • Нужно ли calculateSomethingпринять (1) одно значение или (2) ListOfK значений?
  • Нужно ли calculateAnother принимать (1) ListOfK значений или (2) ListOfKListOfK значений?

Я думаю, вы хотите вариант 1, но вы на самом деле выбрали вариант 2.

Чтобы это исправить, неограничение K в SomeService:

public interface SomeService<K> {
    int calculateSomething(K input);
    int calculateAnother(ListOfK<K> list);
}
0 голосов
/ 09 мая 2019

Проблема заключается в том, как вы определяете интерфейс SomeService. Ваш код <K extends ListOfK<K>> говорит, что «нам нужен класс K, который расширяет ListOfK, который использует K в качестве параметра типа». Так что этот класс должен выглядеть примерно так:

public class Test extends ListOfK<Test> {

Что не имеет никакого смысла. Он должен не только использовать себя внутри списка. Если вы измените интерфейс на что-то вроде:

public abstract interface SomeService<K extends ListOfK<?>> {

Это должно исправить вашу проблему.

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