Перезаписать универсальный тип класса - PullRequest
0 голосов
/ 31 октября 2019

У меня есть этот интерфейс:

interface Entity<PK> {
    PK getPk();
    void setPk(PK pk);
}

, который я перезаписываю следующим образом:

class User implements Entity<User.PK> {
    PK pk;

    @Override
    public PK getPk() { return pk; }

    @Override
    public void setPk(PK pk) { this.pk = pk; }

    // Composed primary key
    class PK {
        String id;
        String email;
    }
}

Но если бы мне пришлось расширять класс User для расширения универсального типа User.PKЯ не мог, потому что the method setPk(UserEntity.PK) of type UserEntity must override or implement a supertype method.

class UserEntity extends User {
    PK pk;

    @Override
    public PK getPk() { return pk; }

    @Override
    public void setPk(PK pk) { this.pk = pk; }

    class PK extends User.PK implements Serializable {
        String id;
        String email;
    }
}

Так как я могу создать интерфейс для данного универсального типа, но иметь возможность расширять классы, которые его реализуют?

1 Ответ

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

Я бы посоветовал это решение:

  1. ваш interface Entity<PK> выглядит хорошо
  2. извлеките class PK определение в отдельный файл с именем UserPk
  3. слегкапереопределить User как этот
class User<PK> implements Entity<PK> {
    private PK pk;

    @Override
    public PK getPk() { return pk; }

    @Override
    public void setPk(PK pk) { this.pk = pk; }  
}

и использовать его позже как new User<UserPk>()

поместить в отдельный класс тоже
class UserEntityPk extends UserPk implements Serializable {
        String id;
        String email;
}
повторное использование class User<PK> таким образом с новым параметром ключа new User<UserEntityPk>()

Основная идея состоит в том, чтобы отделить ваши параметризованные классы от определений ключей для упрощения архитектуры.

Кстати, просто любопытно, в чем разница между определениями ваших ключей? Оба они имеют одинаковые строки id и email. Похоже, вам не нужно class PK extends User.PK implements Serializable вообще.

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