Обобщения Java: как получить идентификатор универсального класса в универсальном интерфейсе? - PullRequest
0 голосов
/ 02 декабря 2018

Я использую JDK 7.

У меня есть абстрактный класс BaseEntity, использующий дженерики:

public class BaseEntity<Id extends java.io.Serializable> {
  protected Id id;

  public BaseEntity() {
  }

  public Id getId() {
    return id;
  }
  public void setId(Id id) {
    this.id = id;
  }

  // also has hashCode() and equals() methods to be based on id
}

Теперь я хочу создать интерфейсчей тип будет BaseEntity, и я также хочу, чтобы Id из BaseEntity был доступен в интерфейсе.Как я могу это сделать?

Я попробовал этот код:

public interface BaseLookup<T extends BaseEntity> {
   T findById(Id id);
}

, но получил 2 сообщения:

  1. 1-е было включено BaseEntity.Сообщение было:

Базовый объект является необработанным типом.Ссылки на универсальный тип BaseEntity<Id> должны быть параметризованы.

2-й был на "Id".Сообщение об ошибке было:

Идентификатор не может быть преобразован в тип.

Что я здесь не так делаю?

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Вы должны указать тип BaseEntity в BaseLookup.Для лучшей читаемости я определяю тип ID как I.Вы можете использовать что-то вроде этого:

class BaseEntity<I extends java.io.Serializable> {
      protected I id;

      public BaseEntity() {
      }

      public I getId() {
        return id;
      }
      public void setId(I id) {
        this.id = id;
      }

      // also has hashCode() and equals() methods to be based on id
}

interface BaseLookup<I extends java.io.Serializable, T extends BaseEntity<I>> {
      T findById(I id);
}
0 голосов
/ 02 декабря 2018
public interface BaseLookup<Id, T extends BaseEntity<Id>> {
   T findById(Id id);
}

Поскольку вы параметризовали BaseEntity, вы должны всегда использовать параметр всякий раз, когда вы ссылаетесь на BaseEntity.Первое предупреждение, которое вы получили, говорило о том, что вы используете необработанный тип BaseEntity (без параметров), который действительно существует только для устаревшего кода и не должен использоваться.Поскольку, якобы, BaseEntity - это не просто один тип, а целая коллекция типов (по одному на каждый T), нам нужно сообщить ему , какой BaseEntity мы расширяем, что составляетдобавление дополнительного универсального аргумента.

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