Как устранить предупреждение: ссылки на универсальный тип должны быть параметризованы - PullRequest
0 голосов
/ 07 октября 2019

Я создал универсальный интерфейс.

public interface Abc<T> {
    void validatePojo(T input);
}

Следующие два класса являются реализацией вышеуказанного интерфейса.

1)-----------------------------------------------
  public class Hello implements Abc<Pojo1> {
       @Override
       public void validatePojo(Pojo1 input) {
          // some code
       }
  }
2)-----------------------------------------------
  public class Hi implements Abc<Pojo2> {
       @Override
       public void validatePojo(Pojo2 input) {
          // some code
       }
   }

Теперь, когда я пытался создать объект Abc,

T input = getInput(someInput);    // getInput return either Pojo1 or Pojo2
Abc abc = someFactory(someInput); //someFactory(someInput) will return either `new Hello()` 
  ^                               //or `new Hi()` based on `someInput`
  |
  +-------------------------------//warning
abc.validate(input);

public Abc<?> someFactory(final int input) {
    return input == 1 ? new Hi() : new Hello();
}

public T getInput(final int input) {
    return input == 1 ? new Pojo1() : new Pojo2();
}

Я получаю пари Abc is a raw type. References to generic type Abc<T> should be parameterized.

Как я могу восстановить это предупреждение?

Я посмотрел в интернете, нашел следующее, но это не оченьполезно.

  1. Один из найденных мной способов - использовать @SuppressWarnings.
  2. Объявить переменную, например Abc<Pojo1> abc или Abc<Pojo2> abc, я не могу сделать это как использовать Pojo1или Pojo2 полностью зависит от ввода (я не хочу писать здесь логику фабричного метода)

Есть ли другой способ восстановить его?

1 Ответ

0 голосов
/ 07 октября 2019

Компилятор всего лишь напоминает вам, что Abc является универсальным и зависит от типа, который вы передаете на своей фабрике. Поэтому:

Abc<?> abc = ...
Abc<? extends Object> abc = ...

, как указано в комментариях, должно быть действительным. Расширенная версия полезна, если вы хотите указать тип передаваемого объекта.

...