覆盖类通用类型

时间:2019-10-31 14:28:38

标签: java oop generics

我有这个界面:

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 :(得分:0)

我会建议这种解决方案:

  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>()

一样使用
  1. 也进入单独的课程
class UserEntityPk extends UserPk implements Serializable {
        String id;
        String email;
}
  1. 以这种方式重复使用class User<PK>和新的密钥参数new User<UserEntityPk>()

关键思想是将参数化的类与键的定义分开,以简化体系结构。

顺便说一句,古玩您的按键定义之间有什么区别?他们两个都有相同的idemail字符串。这样看来您根本不需要class PK extends User.PK implements Serializable