Универсальный Java, возвращающий конкретную проблему экземпляра - PullRequest
0 голосов
/ 27 сентября 2019

Пожалуйста, помогите.Я не могу иметь дело с дженериками.У меня есть: Общий репозиторий интерфейса:

@NoRepositoryBean
public interface PageBaseRepository<T extends PageBase> extends CrudRepository<T, Long> {
    List<T> findAllByUserId(UUID userId);
}

@Repository
public interface StandardPageRepository extends PageBaseRepository<StandardPageEntity> {
}

@Repository
public interface BlockPageRepository extends PageBaseRepository<BlockPageEntity> {
}

@MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class PageBaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @NotNull
    private UUID userId;
    private String content;


@Entity
public class StandardPageEntity extends PageBaseEntity {
    private String extraField;
}

@Entity
public class BlockPageEntity extends PageBaseEntity {
    private String blockPosition;
}

@Component
@RequiredArgsConstructor
public class PageRepositoryFactory {
  private final StandardPageRepository standardPageRepository;
  private final BlockPageRepository blockPageRepository;


    public <R extends PageBaseRepository<E>, E extends PageBaseEntity> R getRepository(final E entity) {
        if (entity instanceof StandardPageEntity) {
            return standardPageRepository;
        }
        if (entity instanceof BlockPageEntity) {
            return blockPageRepository;
        }
        throw new IllegalArgumentException("Not recognised pension object " + pensionEntity.getClass());

    }
}

Я получаю подсказку в intelij:

Несовместимые типы.Обязательно: R Найдено: StandardPageRepository

и ошибка в консоли:

PageRepositoryFactory.java: 15: ошибка: несовместимые типы: StandardPageRepository не может быть преобразовано в R return standardPageRepository;^ где R, E - переменные типа: R расширяет PageBaseRepository, объявленный в методе getRepository (E) E расширяет PageBaseEntity, объявленный в методе getRepository (E)

Одна вещь, которую я обнаружил, заключается в том, что я могу выполнять приведение, но это ужасно, компилятор говорит, что это Unchecked cast.И я не хочу это предупреждение.

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